分类：电脑/网络-程序设计-C/C++
问题：格子排数问题（我程序作出为什么结果是错误的）格子排数问题例如：1 
格子排数问题例如：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[格子排数问题例如：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的值不可能为这两个)没有全改，大概写了一个，详见源码。