原题链接:
#include<iostream>
using namespace std;
int s[13] = {1,1,1,1,1,0,0,0,0,0,0,0};
int ans;
int g[3][4];
int dir[4][2] ={ {0,1},{0,-1},{1,0},{-1,0}};
void dfs(int x,int y)
{
g[x][y] = 0;
for(int i =0;i<4;i++){
int nx = x + dir[i][0];
int ny = y+ dir[i][1];
if(nx>=0&&nx<3 && ny>=0&&ny<4 && g[nx][ny]==1){
dfs(nx,ny);
}
}
}
bool check(){
int cnt =0; //连通块数量
for(int i =0;i<3;i++){
for(int j =0;j<4;j++){
if(s[i*3+j]) g[i][j] =1;
}
}
for(int i =0;i<3;i++){
for(int j =0;j<4;j++){
if(g[i][j]){
dfs(i,j);
cnt++;
}
}
}
if(cnt==1)
return true;
else
return false;
}
void permutation(int len,int idx)
{
if(idx==len){
if(check()){ //当前全排列符合要求
ans++;
}
}
for(int i = idx;i<len;i++){
bool flag = true;
for(int j = i+1;j<len;j++){
if(s[i]==s[j])
flag = false;
}
if(flag){
swap(s[idx],s[i]);
permutation(len,idx+1);
swap(s[idx],s[i]);
}
}
}
int main()
{
permutation(12,0);//p[i][j] 全排列的元素个数,当前排列到的下标
cout<<ans<<endl;
}