如题!
希望大家给我一个思路
最好是用c#来帮我解答这道问题!

解决方案 »

  1.   

    #include "stdio.h"
    #define N 11/*设定可填入的整数个数*/
    int pos;/*标示方格的序号*/
    int a[9];/*用于存储方格所填入的整数*/
    int b[N];/*用于存储整数是否填入方格的标志,若填入则该标志为0*/
    int checkmatrix[][3]={{-1},{0,-1},{1,-1},{0,-1},{1,3,-1},{2,4,-1},{3,-1},{4,6,-1},{5,7,-1}};
        /*存储需要需要检查合理性的相邻方格的序号,-1拦截以结束检查*/
    void write(int a[])/*打印一组解*/
    { int i,j;
       
       printf("------------------\n");
       for(i=0;i<3;i++)
       {
       for(j=0;j<3;j++)
           {
       printf("%3d",a[3*i+j]);
           }
       printf("\n");
       }
        printf("------------------\n");
    }
    int isprime(int m)/*判断一个数是否是素数*/
    {
    int i;                                    
    int primes[]={2,3,5,7,11,17,19,23,29,-1};  
    if(m==1||m%2==0) return 0;                 /*若为1或偶数则排除*/
    for(i=0;primes[i]>0;i++)
    if(m==primes[i]) return 1;             /*若为列表中素数则确认*/
    for(i=3;i*i<=m;i+=2)if(m%i==0)return 0;    /*寻找m的因数,若有因数则排除*/
    return 1;
    }
    int selectnum(int start)/*从小到大查找还未填入方格中的整数,若无返回0*/                       
    {
    int j;
    for(j=start;j<N;j++)if(b[j])return j;
    return 0;
    }
    int check(int pos)/*检查填入POS位置的整数是否合理*/
    {int i,j;
     for(i=0;(j=checkmatrix[pos][i])>=0;i++)/*查找检验合理性数组中对应行存放的相邻方格的序号*/
     if(!isprime(a[pos]+a[j]))return 0;/*检验相邻方格的序号是否为素数*/
     return 1;
    }
    int extend(int pos)/*为下一个方格找一个尚未使用过的整数*/
    {a[++pos]=selectnum(1);
     b[a[pos]]=0;/*置标志位为0,该数已填入*/
     return pos;
    }
    int change(int pos)/*调整当前方格填入的整数,使其合理,若找不到则回溯*/
    {
    int j;
    while(pos>=0 && (j=selectnum(a[pos]+1))==0)b[a[pos--]]=1;/*若找不到则后退到前一方格,并清除当前方格整数的填入标志*/
    if(pos<0)return -1;/*若第一个方格也找不到则返回-1,表明已回溯完毕*/
    b[a[pos]]=1;/*恢复已填入但不合理的整数*/
    a[pos]=j;/*填入下一个试探的数*/
    b[j]=0;/*置该试探数的填入标志为0,表明填入*/
    return pos;/*返回当前方格的序号*/
    }
    void find()/*寻找解主程序*/
    {
    int ok=1;
    pos=0;a[pos]=1;b[a[pos]]=0;/*初始化*/
    do{
    if(ok)
    if(pos==8)/*表明已找到一组解*/
    {write(a);/*打印这组解*/
    pos=change(pos);/*回溯,寻找另一组解*/
    }
    else pos=extend(pos);/*填下一个方格*/
    else pos=change(pos);/*调整当前所填整数*/
    ok=check(pos);/*判断当前方格所填数是否合理,合理则OK为1*/
    }while(pos>=0);/*回溯完毕则循环结束,程序亦结束*/
    }
    main()
    {
    int i;
    for(i=1;i<N;i++)
    b[i]=1;/*所有整数的填入标志初始化*/
    find();
    }