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
1 2
Sample Output
1 2 4 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;
}
超时。。。。。。