您的位置 电脑知识爱好者 >> 编程知识 >> 格子排数问题(我程序作出为什么结果是错误的)

格子排数问题(我程序作出为什么结果是错误的)

电脑知识爱好者互联网本站整理2007-9-6 9:41:24
知识重点:格子排数问题 例如: 1 2 5 4 3 8 7 10 9 从整数1至10中任取九个不同的数,填入一个3*3的格子中,使所有左右相邻和上下相邻的两个格子中的数之和是素数(质数)。 程序 int i,j; main() {i..

格子排数问题 例如: 1 2 5 4 3 8 7 10 9 从整数1至10中任取九个不同的数,填入一个3*3的格子中,使所有左右相邻和上下相邻的两个格子中的数之和是素数(质数)。 程序 int i,j; main() {int su(int x,int y); void jia(); void jian(); int q=0,u=0,top=0,k,d,e,m,c; int b[10],a[3][3]; i=0;j=0;b[0]=b[1]=0;c=0; while(top<=9) {d=1; if(i==0)u=0; else u=a[i-1][j]; if(j==0)q=0; else q=a[i][j-1]; for(k=1;k<=10;k++) {e=0; for(m=0;m<=top;m++) {if((k==b[m])||(k==c)) {e=1;}} if(e==1)continue; if(su(q,k)==0&&su(u,k)==0) {top++; b[top]=k;a[i][j]=k; jia();d=0;}} if(d==1) {c=b[top];b[top]=b[--top]; jian();}} for(i=0;i<=2;i++) {for(j=0;j<=2;j++) printf("%3d",a[i][j]); printf("\n");}} int su(int x,int y) {int m,n,u=0; if(x==0) return(0); m=x+y; for(n=2;n<m;n++) {if(m%n==0) {u=1;break;}} if(u==1) return(0); if(u==0) return(1);} void jia() { if((j==2)&&(i<=1)) {i++;j=0;} if((j==0)||(j==1)) j++;} void jian() { if(j==0) {j=2;i--;} if((j==1)||(j==2)) j--;} 用i,j代表全局变量,e,d是逻辑判断用的,u代表 a[i][j]的上一位,q代表a[i][j]的左边那一位。 su(int x,int y)意思为判断两数相加是否为素数 b[]数组可以代表一个栈,按从上往下,从左而右的 顺序找,找到则放进b[]数组里,也用jia()函数把 a[i][j]进一位,找不到则b[]数组后退一位 同时a[i][j]也后退一位。 其他的没有仔细看,下面两个函数均有问题

void jia()

{ if((j==2)&&(i<=1))

{i++;j=0;}

if((j==0)||(j==1))

j++;}

这里应该为

void jia()

{

if((j==2)&&(i<=1))

{i++;j=0;}

else if((j==0)||(j==1))

j++;

}

少了一个else,如果按你原来的程序,假如i为0j为2,本来应该变成i为1j为0,却成了i为1j为1

void jian()

{ if(j==0)

{j=2;i--;}

if((j==1)||(j==2))

j--;}

同上面的程序,少了一个else,应该为

void jian()

{

if(j==0)

{

j=2;

i--;

}

else if((j==1)||(j==2))

j--;

}

另外,你写的判断素数的程序也不对,如果输入的x+y的值为1和2判断都为错误的(虽然在这个程序里面,x+y的值不可能为这两个)

没有全改,大概写了一个,详见源码。



参与评论
相关内容
关于我们 | 隐私政策 | 站点地图 | 站长博客|京ICP备07025396号
添加到百度搜藏 添加到百度搜藏 电脑知识爱好者Copyright ?2006-2008版权所有 我要啦免费统计