N*N的棋盘

来源:互联网 发布:leave it as it is 编辑:程序博客网 时间:2024/04/28 16:34

N*N的棋盘

Time Limit:5s Memory Limit:1000k
Total Submit:3719 Accepted:1705
下载样例程序(PE)
下载样例程序(ELF)


Problem

在N*N的棋盘上(1<=N<=10)填入1,2,...N*N共N*N个数,使得任意两个相邻的数之和为素数.

例如,当N=2时,有

1 2

4 3

Input

输入第一行为一整数T,表示有T组测试数据.

每组测试数据一行,为一整数N(1<=N<=10)

Output

输出满足条件的最小序列的方案。

最小序列即将每一行连接起来组成一行,然后使前面的尽可能小,当第一个数字相同时则比较下面一个,依次类推。

比如当N=2时,序列为1 2 4 3,当无满足条件的方案时输出"NO"。

Sample Input

12

Sample Output

1 24 3

My Solution

#include <stdio.h>
#include <memory.h>

int main(int argc, char* argv[])
{
    int pos[10 * 10];
    char isPrime[200];

    int N, count, i, j, N2;
    int curr_pos, curr_value, a, b;

    memset(isPrime, 1, sizeof(isPrime));
    isPrime[0] = isPrime[1] = 0;
    for(i = 2; i < sizeof(isPrime); i++){
        a = i + i;
        while(a < sizeof(isPrime)){
            isPrime[a] = 0;
            a += i;
        }
    }

    scanf("%d", &count);
    for(i = 0; i < count; i++){
        scanf("%d", &N);
        N2 = N * N;

        curr_pos = 0;   curr_value = 1;
        while(1){
            for(j = 0; j < curr_pos; j++){
                if(pos[j] == curr_value){
                    goto find_next;
                }
            }
            a = curr_pos / N;
            b = curr_pos % N;
            if(a > 0) if(!isPrime[pos[(a-1)*N+b] + curr_value]) goto find_next;
            if(b > 0) if(!isPrime[pos[curr_pos-1]+ curr_value]) goto find_next;
            pos[curr_pos] = curr_value;
            curr_pos ++;
            if(curr_pos >= N2){
                for(a = 0; a < N; a++){
                    for(b = 0; b < N; b++){
                        printf("%d ", pos[a*N+b]);
                    }
                    putchar('/n');
                }
                break;
            }
            curr_value = 1;
            continue;
find_next:
            curr_value++;
            if(curr_value > N2){
                curr_pos--;
                if(curr_pos < 0) puts("NO");
                curr_value = pos[curr_pos]+1;
            }
        }
    }

    return 0;
}

超时。。。。。。