题意
- 把一个a*b个小正方形组成的大正方形切成两块有多少种切法?
思路
- 爆搜,对于正方形a*b转化为点阵图坐标为[0,a][0,b]
- 其中(0,0)(a,0)(0,b)不能作为起点,对于每个起点,找可能的终点即可
- 由于对称性,两条对边方案重合,所以只搜索一组邻边即可
- DFS要从不在边上的点开始,把起点标为访问,所以DFS总是标记了上一个访问的点,进入后要先把当前点标记,同理,回溯也是四个方向尝试完后,把当前点取消标记
#include<bits/stdc++.h>
using namespace std;
int a,b;
long long ans=0;
int dir[4][2]={0,1,0,-1,1,0,-1,0};
int vis[8][9];
void dfs(int x,int y){
if(x<1||y<1||x>=a||y>=b){
ans++;
return;
}
vis[x][y]=1;
for(int i=0;i<4;i++){
int tx=x+dir[i][0];
int ty=y+dir[i][1];
if(vis[tx][ty]) continue;
dfs(tx,ty);
}
vis[x][y]=0;
}
int main(){
//对于正方形a*b转化为点阵图坐标为[0,a][0,b]
//(0,0)(a,0)(0,b)不能作为起点,爆搜两条边即可
scanf("%d%d",&a,&b);
for(int i=1;i<a;i++){
memset(vis,0,sizeof(vis));
vis[i][0]=1;
dfs(i,1);
}
for(int i=1;i<b;i++){
memset(vis,0,sizeof(vis));
vis[0][i]=1;
dfs(1,i);
}
printf("%d",ans);
return 0;
}