格子排数问题
例如:
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]也后退一位。