/*
Attention:二维数组作为形参时,其第二维需指明大小********************************
*/
bool CBacktrack::ok(int x[], int k, bool c[][], int n)
{
if(k>=n)
return false;
for(int i=0;i<k;i++)
{
if((x[i]==x[k]) && (c[i][k]))
return false;
}
return true;
}
/*
地图着色问题
n块区域,m种颜色(1,2,...,m),相邻区域用不同的颜色标识
*/
void CBacktrack::coloring(int x[], bool c[][], int n, int m)
{
int i,k=0;
for(i=0;i<n;i++)
x[i]=0;
while(k>=0)
{
x[k]=x[k]+1;
while((x[k]<=m) && (!ok(x,k,c,n)))
x[k]=x[k]+1;
if(x[k]<=m)
{
if(k==n-1)
{
break;
}
else
{
k=k+1
}
}
else
{
x[k]=0;
k=k-1;
}
}
}