1.题目展示
2.解法思路
答案的特征
通过题目中所给的三个图,我们可以得知答案有如下两个性质:
第一,答案中不存在斜向连续的解,如下图所示:
由此可得,两部分的分界线不经过同一点。
第二,从同一方格出发的某一解有四个相同解,如下图所示:
由此可得,若在执行函数时不加以限制,则总答案数量要除以四。
解题思路
很容易想到有两种解题思路:
第一,从方块内部出发,深搜方块,总面积s=18时停止并计数即可;
但是这种解法需要在函数运行的时候去除顺序排列对解的数量的影响,如下图所示:
这两种深搜结果是同一个解,需要想办法去重,不是很提倡。
第二,深搜格点,构造一条分割线,分割线的两端分别接触到6x6方格的边缘时即可;
需要注意的是,分割线一定经过坐标(3,3)且中心对称,如下图所示:
所以我们从格点(3,3)开始搜索,搜一半即可
3.代码
挺简单的,看看就能懂,不细讲了
#include<bits/stdc++.h>
using namespace std;
int ans=0;
int dx[4]={0,0,-1,1};
int dy[4]={-1,1,0,0};
int book[7][7]={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 nx=x+dx[i];
int ny=y+dy[i];
if(book[nx][ny]==1)continue;
//因为对称,分割线是两个方向同时生成的
//对称的格点也要去除
book[nx][ny]=1;
book[6-nx][6-ny]=1;
dfs(nx,ny);
book[nx][ny]=0;
book[6-nx][6-ny]=0;
}
}
int main(){
book[3][3]=1;
dfs(3,3);
cout<<ans/4;
return 0;
}