回溯的问题[求解]
本程序在3*3 的方格中填入数字1-N(n>=10)内的某9个互不相同的整数,使得所有相邻的方格内的两个整数之和为质数。是求出满足这个要求的所有填法。
程序采用试探法,即从序号为0的方格开始,为当前方格,寻找一个合理的可填入整数,并在当前位子填入正确数字后,为下一方格寻找合理的整数。不如能为当前方格填入一个合理的整数,就要回退到前一方格,调整前一方格的填入整数。
当直至序号为8的方格也填入合理的整数后,就找到一个解,将该解输出,并调整序号8的方格所填入整数,继续去找下一个解。为了检查当前方格的填入整数的合理性,程序引入二维数组checkmatrix,存放需要进行合理性检查的相邻方格的序号。
#include <stdio.h>
#define N 12
int b[N+1];
int pos;
int a[9];/*用于存储方格所填入的整数*/
checkmatrix[][3]={{-1},{0,1},{1,1}
{0,-1},{1,3,-1},{2,4,-1}
{3,-1},{4,6,-1},{5,7,-1}};
void write (int a[])
{int i,j;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
printf("%3d",a[3*i+j]);
printf("\n");
}
int isPrime (int m)
{ int i;
if (m==2) return 1;
if (m==1 || m%2==0) return 0;
for (i=3;i*i<=m;)
{
if (m%i==0)
return 0;
i+=2;
}
return 1;
}
int selectNum (int start)
{ int j;
for (j=start;j<N;j++)
if (b[j]) return j;
return 0;
}
int check()/*检查填入pos位置的整数是否合理*/
{ int i,j;
for(i=0;(j=( 1 )>=0;i++)
if(!isPrime(a[pos]+a[j]))
( 2 );
( 3 );
}
extend()/*为下一方格找一个尚未使用过的整数*/
{ a[(4)]=selectNum(1);
b[a[pos]]=0;
}
void change()/*为当前方格找下一个尚未使用过的整数。(找不到回朔)
{ int j;
whilt (pos>=0&&(j=selectNum( 5 ))==0 ( 6 );
if (pos<0) return ;
b[a[pos]]=1;a[pos]=j;b[j]=0;
}
find()
{int ok=1;
pos=0;a[pos]=1;b[a[pos]]=0;
do
{
if(ok)
if( 7 )
{
write(a);
change();
}
else
extend();
ok=check();
}while(pos>=0);
}
main()
{ int i ;
for(i=1;i<=N;i++)
b[i]=1;
find();
}
请各位帮我解答一下 checkmatirx 哪个数组到底有什么用,它的赋初值到底有什么用,为什么要那样赋初值!