格子排数问题(我程序作出为什么结果是错误的)
格子排数问题 例如: 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的值不可能为这两个)
没有全改,大概写了一个,详见源码。
参与评论
- 相关内容
- 最近更新
- ·avi播放器 "智能影院"..
- ·手机通话时间的查法
- ·NOKIA6260手机文件传输问题请大家..
- ·我有一部索愛P900手機,內存卡是..
- ·诺基亚QD支持哪些电影?
- ·诺基亚5200和5300有什么区别?
- ·手机电池“没电”是应该一点电没..
- ·从三星网站下了软件但还是下不了..
- ·QQ组能否掉换顺序?
- ·QQ空间免费物品
添加到百度搜藏