方格分割
题目:6x6的方格,沿着格子的边线剪开成两部分。要求这两部分的形状完全相同。
解题思路:将方格看成一个二维坐标,(0,0)为原点,(3,3)为中央对称点开始遍历,上下左右可以设置成数组dx[4]={1,0,-1,0},dy[4]={0,1,0,-1}
map[7][7]数组代表该点的访问权限,当遍历到边界时,计数器加一。该题重点为分割线一定中心对称!!
1 #include <iostream> 2 #include <memory.h> 3 #include <stdio.h> 4 #include <stdlib.h> 5 using namespace std; 6 int dir[4][2]={0,1,0,-1,1,0,-1,0}; 7 int visited[10][10]; 8 int ans=0; 9 void dfs(int x,int y){ 10 if(x==0||y==0||x==6||y==6){//已经走到边界!!!!!! 11 ans++; 12 return; 13 } 14 for(int i=0;i<4;i++){ 15 int x1=x+dir[i][0]; 16 int y1=y+dir[i][1]; 17 int x2=6-x1; 18 int y2=6-y1; 19 20 if(x1>=0&&x1<=6&&y1>=0&&y1<=6){ 21 if(!visited[x1][y1]){//该点未被访问过 22 visited[x1][y1]=visited[x2][y2]=1;//标记访问位 23 dfs(x1,y1);//深搜 24 visited[x1][y1]=visited[x2][y2]=0;//回溯 25 } 26 } 27 } 28 } 29 30 int main(){ 31 memset(visited, 0, sizeof(visited)); 32 visited[3][3]=1; 33 dfs(3,3); 34 cout<<ans/4<<endl; 35 }