已知如下递归代码用于求解图的m着色问题:
#define N 10
int a[N+1][N+1]; //存储图
int x[N+1];//记录颜色
int sum=0;//保存可着色方案数
void backtrace(int t,int m)
{
int i;
if(t>N)//搜索至叶节点
{
sum++;
printf("第%d种方案:\n",sum);
for(i=1;i<=N;i++)
printf("%d ",x[i]);
printf("\n");
}
else
{
for(i=1;i<=m;i++) //逐个判断每种颜色
{
if(check(t,i))
{ x[t]=i;
backtrace(t+1,m);
}
}
}
}
其中check()函数用于检测某个节点颜色是否合法,以下check()函数正确的是:
int check(int t,int i)//检测函数 { int j; for(j=1;j<t;j++) { if(a[t][j]==1&&x[i]==j) return 0; } return 1; }
int check(int t,int i)//检测函数 { int j; for(j=1;j<t;j++) { if(a[t][j]==1||x[i]==j) return 0; } return 1; }
int check(int t,int i)//检测函数 { int j; for(j=1;j<t;j++) { if(a[t][j]==1||x[j]==i) return 0; } return 1; }
int check(int t,int i)//检测函数 { int j; for(j=1;j<t;j++) { if(a[t][j]==1&&x[j]==i) return 0; } return 1; }