C言語で、チェス盤にクイーンを、互いにかち合わないように置いていくプログラムを書いています(いわゆる『Nクイーン問題』です)。
再帰的な書き方が望ましいのだとは思うのですが、まず列ごとに個別で関数を作ってみたところ、3列目でハマってしまいました。
該当のソースコード
C
1#include <stdio.h> 2 3int board[3]; 4 5void solve2() { // 2列目 6 int i, j; 7 8 for (i = 0; i < 8; i++) { 9 for (j = 0; j < 2; j++) { // 1列目と2列目との重複を判定 10 if (board[j] == i) continue; 11 if (j - board[j] == 2 - i) continue; 12 if (j + board[j] == 2 + i) continue; 13 board[2] = i; 14 for (j = 0; j < 3; j++) printf("%d ", board[j]); 15 printf("\n"); 16 } 17 } 18} 19 20void solve1() { // 1列目 21 int i, j; 22 23 for (i = 0; i < 8; i++) { 24 for (j = 0; j < 1; j++) { // 1列目との重複を判定 25 if (board[j] == i) continue; 26 if (j - board[j] == 1 - i) continue; 27 if (j + board[j] == 1 + i) continue; 28 board[1] = i; 29 solve2(); 30 } 31 } 32} 33 34void solve0() { // 0列目 35 int i; // 0列目の上から何番目のマスか 36 37 for (i = 0; i < 8; i++) { 38 board[0] = i; 39 solve1(); 40 } 41} 42 43int main(void) { solve0(); }
こちらを実行すると、出力結果が
0 2 0 0 2 1 0 2 3 0 2 4 0 2 5 0 2 6 0 2 7 0 3 0 0 3 1 0 3 3
と続いていき、どこを見ても1列目と2列目の判定は正しくなされているものの、3列目に出てくる数字はそれ以前の列との重なりを正しく判定してくれません。
どこが間違っているのか、いくら考えてもわからず煮詰まってしまったため、teratailに初めて投稿させて頂きました。
先輩の皆様にご教示頂けましたなら幸いです。どうぞよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/13 06:29
2019/12/13 07:12
2019/12/13 07:36