右侧的木块经过旋转后在拼接,说明其必然是对称的,所以寻找切割线时只在一边找,另一边对称即可(下图来源拼接-CSDN博客)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=10;
bool vis[N][N];
ll res;
int dx[]={1,0,-1,0};
int dy[]={0,-1,0,1};
void dfs(int x,int y){
if(!x||y==7){//可以切割
res++;
return;
}
for(int i=0;i<4;i++){
int nx=x+dx[i],ny=y+dy[i];
if(nx<0||ny<0||nx>7||ny>7) continue;
if(vis[nx][ny]) continue;
if(nx==ny) continue;//不要越过中心线
vis[nx][ny]=true;
dfs(nx,ny);
vis[nx][ny]=false;
}
}
int main(){
for(int i=0;i<=7;i++){
vis[i][i]=true;
dfs(i,i);
}
cout<<res;
}