質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

703閲覧

チェスの盤面の設置プログラムで、設置禁止エリアを作りたいです。

john010

総合スコア9

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/07/16 06:58

このプログラムは、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 . . .

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2021/07/16 07:32

コードの説明をしてください. 現状,どのようなアルゴリズムで問題を解いているのか? その中で > int row[N], col[N], pos[2 * N - 1], neg[2 * N - 1]; こいつらはどんな役目を果たす何の情報なのか? etc... あなたのコードを全てノーヒントで読み解いてさらに改造しろとおっしゃる?
guest

回答1

0

ベストアンサー

1つ任意の穴が空いていて、そこにはQueenを置いてはならない

なら、置けるか置けないかの判断の個所で、穴の位置だったら「置けない」とすればよいのではないでしょうか。

投稿2021/07/16 15:28

jimbe

総合スコア13209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問