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;
}
超時。。。。。。