本帖最后由 yunyan2140 于 2010-10-24 21:15:06 编辑

解决方案 »

  1.   


    import java.util.Arrays;public class Pgrid {
        boolean[] p = new boolean[50];
        int[][] m = new int[5][5];
        boolean[] used = new boolean[26];
        
        Pgrid() {
            p[2] = p[3] = p[5] = p[7] = p[11] = p[13] = true;
            p[17] = p[19] = p[23] = p[29] = p[31] = p[37] = true;
            p[41] = p[43] = p[47] = true;
        }
        
        boolean isOk(int i, int j, int x) {
            if(used[x]) return false;
            if(i>0 && !p[x+m[i-1][j]]) return false;
            if(j>0 && !p[x+m[i][j-1]]) return false;
            return true;
        }
        
        void fill(int index) {
            if(index==25) {
                for(int i=0; i<5; i++)
                    System.out.println(Arrays.toString(m[i]));
                System.out.println("============");
                System.exit(0); // or return; if need all results
            }
            int i = index/5;
            int j = index%5;
            for(int x=1; x<=25; x++) {
                if(isOk(i, j, x)) {
                    m[i][j] = x;
                    used[x] = true;
                    fill(index+1);
                    used[x] = false;
                }
            }
        }    public static void main(String[] args) {
            new Pgrid().fill(0);
        }}结果
    [1, 2, 3, 4, 7]
    [6, 5, 8, 15, 22]
    [25, 18, 23, 14, 9]
    [16, 13, 24, 17, 20]
    [21, 10, 19, 12, 11]
      

  2.   

    哦,少看了个条件,加上就是。
    把其中的isOk函数改成这样:    boolean isOk(int i, int j, int x) {
            if(used[x]) return false;
            if(i>0) {
                int sum = x+m[i-1][j];
                if(sum <= 11 || sum>=41 || !p[sum]) return false;
            }
            if(j>0) {
                int sum = x+m[i][j-1];
                if(sum <= 11 || sum>=41 || !p[sum]) return false;
            }
            return true;
        }
    不过加上之后无解。 把41改成45就有解了。
      

  3.   

    恩 楼上的8错啊哈哈
    不过不用改isok改p数组就行了
                                   貌似效率会好点啊
      

  4.   

    多谢groovy2007
    呵呵 你没认真看条件 是大于11小于41 不是大于等于和小于等于
    大牛啊 再次说声谢谢