方格分割

题目: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 }

 

posted @ 2020-07-14 16:38  吉吉的奥利奥  阅读(207)  评论(0编辑  收藏  举报