题目描述
在一个6*6的方格纸中,有多少种裁剪方案,使得裁剪后的两部分相等。
题目分析
1.先把所有的可能出现的对称分割枚举出来
2.判断子图是否连通
3.最终答案要除2
#include <cstdio>
#include <iostream>
#include <stack>
#include <algorithm>
#include <time.h>
#include <stdlib.h>
#include <queue>
#include <string.h>
#include <vector>
using namespace std;
int set[40];
int sum = 0;
int m[6][6];
long long ttt = 0;
int check(){
queue<int> myq;
int vist[37] = {0};
myq.push(set[0]);
vist[set[0]] = 1;
int s = 17;
while(!myq.empty()){
int t = myq.front();
myq.pop();
int x = t / 6;
int y = t % 6;
for(int i=0;i<18;i++){
int xx = set[i] / 6;
int yy = set[i] % 6;
if(vist[set[i]]==0 && (abs(x -xx)+ abs(y -yy))==1){//判断是否相连
myq.push(set[i]);
s--;
vist[set[i]] = 1;
}
}
}
if(s == 0)
ttt++;
}
void dfs(int i){
if(i - sum > 17)//剩余格子少于需要的格子
return;
if(sum == 18){
check();
return;
}
int x = i / 6;
int y = i % 6;
if(m[x][y] == 0){
set[sum] = i;
sum++;
m[x][y]=1;
m[abs(5-x)][abs(5-y)] = 2;
dfs(i+1);
sum--;
m[x][y] = 0;
m[abs(5-x)][abs(5-y)] = 0;
}
dfs(i+1);
}
int main() {
dfs(0);
cout<<ttt;
return 0;
}