分类：电脑/网络-程序设计-C/C++
问题：格子排数问题我的程序哪儿错了格子排数问题例如:19从整数1至10 
格子排数问题例如:1 9从整数1至10中任取九个不同的数,填入一个3*3的格子中,使所有左右相邻和上下相邻的两个格子中的数之和是素数(质数)。/*按照从上往下,从左而右的顺序依次确定格子*/inti,j;/*定i,j为全局变量在a[i][j]*/main(){intsu(intx,inty);voidjia();voidjian();intq=0,u=0,top=0,k,d,e,m,c;intb[10],a[3][3];/*b[]数组代表一个栈,a[][]数组代表9个格子*/i=0;j=0;b[0]=0;c=0;while(top<=9){d格子排数问题例如:1 9从整数1至10中任取九个不同的数,填入一个3*3的格子中,使所有左右相邻和上下相邻的两个格子中的数之和是素数(质数)。/*按照从上往下,从左而右的顺序依次确定格子*/inti,j;/*定i,j为全局变量在a[i][j]*/main(){intsu(intx,inty);voidjia();voidjian();intq=0,u=0,top=0,k,d,e,m,c;intb[10],a[3][3];/*b[]数组代表一个栈,a[][]数组代表9个格子*/i=0;j=0;b[0]=0;c=0;while(top<=9){d=1;/*逻辑判断如果d的值改变为0则说明这个数是符合的,放进栈b[]和数组a[][]里*/if(i==0)u=0;/*u和q代表一个格子的上方和左方如果格子在第一行和第一列则把相应的u或q赋为0*/elseu=a[i-1][j];if(j==0)q=0;elseq=a[i][j-1];for(k=1;k<=10;k++)/*e为逻辑判断第2个for循环找一个值，这值没放进栈b[]里，或者上次放进栈里不可以的数*/ {e=0;for(m=0;m<=top;m++){if((k==b[m])||(k==c)){e=1;}}/*e=1代表找到的这个值是重的，或上次放在栈里不可以的数*/if(e==1)continue;if(su(q,k)==0&&su(u,k)==0)/*如果k值符合，则把k值放进栈里，同时也放进数组a[][]里，a[][]后移一位*/{top++;b[top]=k;a[i][j]=k;jia();d=0;}}if(d==1)/*d=1意为找不到符合条件的k值，则栈b[]前移一位，同时a[][]也前移一位*/{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)/*su()函数代表求（x+y）是不是素数，是则返回0，否则返回1，另外当x值为0时，直接返回0*/{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()/*函数意思为让a[i][j]后移一位*/{ if((j==2)&&(i<=1)){i++;j=0;}if((j==0)||(j==1))j++;}void jian()/*函数为让a[i][j]前移一位*/{ 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]也后退一位。   
回答：#include <std.h>#include <math.h>#define N 3#define MAX_NUM (N*N+1)void SetUsed( bool b[MAX_NUM], int number, bool bUsed ){  if ( number <= 0 || number > MAX_NUM )  {    return;  }  b[number-1] = bUsed;}int GetNextAvailable ( bool b[MAX_NUM], int current ){  for( int i=current; i<MAX_NUM; i++ )  {    if ( !b[i] )    {      return i+1;    }  }  return 0;}bool IsPrime ( int n ){  int sqrtn = 0;  int i = 0;  bool bPrime = true;    if ( n <= 1 )  {    return false;  }    if( n==2 )  {    return true;  }  sqrtn = int(sqrt(double(n)));  for( i=2; i<=sqrtn; i++ )  {     if( n%i == 0 )    {      bPrime = false;      break;    }  }  return bPrime;}bool MatchGrid( int current, int left, int top ){  if ( current == 0 )  {//根本没有合适的值可以填在当前的格子里面    return false;  }  if ( left == 0 && top == 0 ||  //最左上角     left == 0 && IsPrime( current + top ) ||  //左侧第一列     top == 0 && IsPrime( current + left ) ||  //上面第一行     left != 0 && IsPrime( current+left) && top != 0 && IsPrime( current+top ) ) //其他位置  {    return true;  }  return false;}int GetLeft( int a[N][N], int i, int j ){  if ( i<0 || i>=N || j<0 || j>= N )  {    return 0;  }  if ( j > 0 )  {    return a[i][j-1];  }  return 0;}int GetTop( int a[N][N], int i, int j ){  if ( i<0 || i>=N || j<0 || j>= N )  {    return 0;  }  if ( i > 0 )  {    return a[i-1][j];  }  return 0;}int GetPrevious( int a[N][N], int i, int j ){  int previous = -1;  if ( i<0 || i>=N || j<0 || j>= N )  {    return -1;  }  if ( j > 0 )  {//这里要注意做了复位操作。    previous = a[i][j-1];    a[i][j-1] = 0;  }  else if ( i > 0 )  {//这里要注意做了复位操作。    previous = a[i-1][N-1];    a[i-1][N-1] = 0;  }  return previous;}int main( ){  int a[N][N];  bool b[MAX_NUM];  int left = 0;  //左侧  int top  = 0;  //上侧  int current = 0;  //当前要填的数  int previous = 0;  int i=0;    //两个索引  int j=0;  bool bMatch = false;  for ( i = 0; i<N; i++ )  {    for ( j = 0; j<N; j++ )    {      a[i][j] = 0;    }  }  for( i=0; i<MAX_NUM; i++ )  {    b[i] = false;  }  i = 0;  j = 0;  while( i >= 0 && i < N )  {    while ( j >= 0 && j < N )    {      current = GetNextAvailable( b, previous );//重头开始找      left = GetLeft( a, i, j );      top = GetTop( a, i, j );      do      {         bMatch = MatchGrid( current, left, top );            }while( !bMatch && (current=GetNextAvailable(b,current))!=0 );            if ( bMatch )//找到      {        a[i][j] = current;                SetUsed( b, current, true );        previous = 0;  //复位        j++;  //下一个数        if ( j>= N )        {//下一行          j = 0;          i++;          if ( i >= N )          {//已经完成了，跳出这一循环            break;          }        }      }      else      {              previous = GetPrevious(a, i, j);        SetUsed( b, previous, false );        if ( j > 0 )//不是第一列        {          j--;          continue;//继续本循环        }        else        {          i--;          j = N-1;          break;//去上一层循环        }      }    }      }  if ( i < 0 )//表示没有找到合适的结果  {    printf("Sorry, I can't find the grid!\n");    return -1;  }  for( i = 0; i < N; i++ )  {    for( j = 0;j < N; j++ )    {      printf("%3d",a[i][j]);    }        printf("\n");  }    return 0;}/*=======================说明=======================在网页上程序的排版发生了变化，看起来很费事，所以你的程序我没有仔细看建议写程序的时候，给变量名起一些有意义的名字，这样自己看起来还比较容易，另外，最好不要用全局变量。我同时上传cpp文件，方便你查看。=======================说明=======================*/