#include<stdio.h>
#include<string.h>
int n,a[10][10],tot=0,colour[10],vis[10][10];
int searchh(){
int ok=1;
for(int m=1;m<=n;m++){
for(int i=1;i<=n;i++){
if(a[i][m]==1&&colour[i]==colour[m]){
ok=0;break;
}
}
}
if(ok) return 1;
else return 0;
}
void dfs(int cur){
if(cur==n+1) {
if(searchh())
tot++;
return;
}
else for(int i=1;i<=4;i++){
colour[cur]=i;
dfs(cur+1);
}
}
int main(){
memset(colour,0,sizeof(colour));
memset(vis,0,sizeof(vis));
freopen("1116.in","r",stdin);
freopen("1116.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&a[i][j]);
}
}
dfs(1);
printf("%d",tot);
return 0;
}
误区:应该在全图dfs全部完成后进行判断。
注意:当一道题目指明数据范围n<=8,O(n!)的算法已经足够!所以本题先直接暴搜(DFS)后判断不超时!