このプログラムは、N*Nの盤面にN個のQueenをおいて、縦、斜め、横のラインに重なるようにおいてはいけないルールのもとで、Queenを置くというものです。
やりたいことは、チェスの盤面には、1つ任意の穴が空いていて、そこにはQueenを置いてはならないというルールを追加することなのですが、下のプログラムをどのように変更追加すればいいかわかりません。
コードとその実行結果を載せておきます。
C
1#define SUCCESS 1 2#define FAIL 0 3#define FREE 1 4#define NOT_FREE 0 5#define N 10 6#define ROW 1 //禁止するの行と列 7#define COL 4 8 9int try(int); 10 11int row[N], col[N], pos[2 * N - 1], neg[2 * N - 1]; 12 13int main() { 14 int i, j; 15 16 for(i = 0; i < N; i++) { 17 row[i] = -1; 18 col[i] = FREE; 19 } 20 for(i = 0; i < 2 * N - 1; i++) { 21 pos[i] = FREE; 22 neg[i] = FREE; 23 } 24 25 if(try(0) == SUCCESS) { 26 for(i = 0; i < N; i++) { 27 for(j = 0; j < N; j++) { 28 if(row[i] == j) 29 printf("Q "); 30 else 31 printf(". "); 32 } 33 printf("\n"); 34 } 35 } else 36 printf("No solution is found.\n"); 37 return 0; 38} 39 40int try(int i) { 41 int j; 42 43 for(j = 0; j < N; j++) { 44 if(col[j] == FREE && pos[i + j] == FREE && neg[i - j + N - 1] == FREE) { 45 row[i] = j; 46 col[j] = NOT_FREE; 47 pos[i + j] = NOT_FREE; 48 neg[i - j + N - 1] = NOT_FREE; 49 50 if(i >= N - 1) 51 return SUCCESS; 52 else { 53 if(try(i + 1) == SUCCESS) 54 return SUCCESS; 55 else { 56 row[i] = -1; 57 col[j] = FREE; 58 pos[i + j] = FREE; 59 neg[i - j + N - 1] = FREE; 60 } 61 } 62 } 63 } 64 return FAIL; 65 66 } 67
result
1Q . . . . . . . . . 2. . Q . . . . . . . 3. . . . . Q . . . . 4. . . . . . . Q . . 5. . . . . . . . . Q 6. . . . Q . . . . . 7. . . . . . . . Q . 8. Q . . . . . . . . 9. . . Q . . . . . . 10. . . . . . Q . . .
コードの説明をしてください.
現状,どのようなアルゴリズムで問題を解いているのか?
その中で
> int row[N], col[N], pos[2 * N - 1], neg[2 * N - 1];
こいつらはどんな役目を果たす何の情報なのか?
etc...
あなたのコードを全てノーヒントで読み解いてさらに改造しろとおっしゃる?
回答1件
あなたの回答
tips
プレビュー