解题思路:
这是大佬的思路:
这道题可能上来会想到搜格子,但搜格子意味着更高的复杂度以及判连通的需要,本题似乎搜索要切开的边更优。由题意,这一条切割线必定经过图的中心点,那么我们一旦确定了半条到达边界的分割线,就能根据这半条对称画出另外半条。而由于结果中心对称性,搜索出来的个数应该除以4得出最终结论。在搜索过程中需要注意的是,我们搜索出的半条分割线不能同时经过关于中心对称的两个点,所以在标记时,需要将对称的点也标上。”
中心点是(3,3),从(3,3)出发,向右、向左、向上、向下,四个方向DFS即可。
思路转载地址:
https://blog.csdn.net/weixin_43914593/article/details/112257103
这个图能让大家更好的理解大佬的思路。
终止条件:
我们会发现,当这条线碰到边界的时候,就能构成一种情况,因此终止条件为:
if (x == 0 || y == 0 || x == 6 || y == 6)
注意:
这两行代码很关键!!!
st[3][3] = true;
cnt / 4
代码如下:
#include <iostream>
using namespace std;
const int N = 10;
bool st[N][N];
int cnt;int dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0};void dfs(int x, int y) {if (x == 0 || y == 0 || x == 6 || y == 6) {cnt++;return ;}for (int i = 0; i < 4; i++) {int xx = x + dx[i], yy = y + dy[i];if (!st[xx][yy]) {st[xx][yy] = true;st[6 - xx][6 - yy] = true;//对称点也要标记哦dfs(xx, yy);st[xx][yy] = false;st[6 - xx][6 - yy] = false;}xx = xx - dx[i], yy = yy - dy[i];//可有可无,有更规范}
}int main() {st[3][3] = true;//这一步很关键!!!dfs(3, 3);cout << cnt / 4 << endl;//记得除以4哦!!!return 0;
}