题解:dfs
生成检查法
#include <iostream>
#include <cstdio>
using namespace std;
int n,s;
int f[10][10];
int color[100];
void dfs(int x)
{
if(x>n)//每当找到1个方案
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j)
{
if(f[i][j])
{
if(color[i]==color[j])//判断能否成立
return ;
}
}
s++;
return ;
}
for(int i=1;i<=4;i++)
{
color[x]=i;
dfs(x+1);
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&f[i][j]);
dfs(1);
cout<<s<<endl;
return 0;
}
回溯法
#include<iostream>
using namespace std;
int n,a[10][10],tot=0,col[10];
void dfs(int x)
{
if(x>n){tot++; return;}
for (int i=1;i<=4;i++)
{
bool p=false;
for (int j=1;j<=n;j++)
if(a[x][j]==1 && i==col[j])
{p=true; break;}
if(p) continue;
col[x]=i;
dfs(x+1);
col[x]=0;
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
dfs(1);
cout<<tot;
}