[蓝桥杯2017初赛]方格分割
题目描述
6x6的方格,沿着格子的边线剪开成两部分。要求这两部分的形状完全相同。如图就是可行的分割法。
![](http://oj.ecustacm.cn/upload/image/20191117/20191117212110_14590.png)
![](http://oj.ecustacm.cn/upload/image/20191117/20191117212144_93066.png)
试计算:包括这3种分法在内,一共有多少种不同的分割方法。注意:旋转对称的属于同一种分割法。
![](http://oj.ecustacm.cn/upload/image/20191117/20191117212110_14590.png)
![](http://oj.ecustacm.cn/upload/image/20191117/20191117212144_93066.png)
![](http://oj.ecustacm.cn/upload/image/20191117/20191117212203_30964.png)
试计算:包括这3种分法在内,一共有多少种不同的分割方法。注意:旋转对称的属于同一种分割法。
输出
输出一个整数表示答案
题解:
观察可以知道,分界线上的点在图案上是关于点(3,3)对称的,所以从这个点开始向四个方向搜索,
因为上下方向是对称的,搜的时候会重复计算。左右方向同理,所以最后结果要除以4
答案:509
#include<iostream> #include<queue> #include<algorithm> #include<set> #include<string.h> using namespace std; int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}}; int vis[10][10]; int ans = 0; void dfs(int x, int y) { if(x == 0 || y == 0 || x == 6 || y == 6)//搜索到边界位置 { ans++; return ; } for(int i = 0; i < 4; i++) { int x1 = x + dir[i][0]; int y1 = y + dir[i][1]; int x2 = 6 - x1;//对称方向 int y2 = 6 - y1; if(x1 >= 0 && y1 >= 0 && x1 <= 6 && y1 <= 6) { if(!vis[x1][y1])//点是对称的,判断一个即可 { vis[x1][y1] = vis[x2][y2] = 1; dfs(x1,y1); vis[x1][y1] = vis[x2][y2] = 0;//回溯 } } } } int main(){ memset(vis, 0, sizeof(vis)); vis[3][3] = 1; dfs(3,3); printf("%d\n",ans/4);//上下方向是对称的,搜的时候会重复计算,左右方向同理,所以最后结果要除以4 return 0; }
等风起的那一天,我已准备好一切