回溯的问题[求解]

EagleFew 2003-09-29 04:34:39
本程序在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 哪个数组到底有什么用,它的赋初值到底有什么用,为什么要那样赋初值!
...全文
43 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧