前提
該当のソースコードに記載した10クイーン問題の再帰関数による解法(アルゴリズム)をわかりやすく解説して下さい。
実現したいこと
以下のソースコードの「alg関数」がどのようなアルゴリズムとなっているのか、できればわかりやすく説明していただくことはできますか?
特に、alg関数の「while (j < queen && i != tab[j] && abs(tab[j] - i) != queen - j)」以降の部分が何をしているのか理解することができておりません。
何卒宜しくお願い致します。
試したこと
以下のソースコードを実行すると以下の結果が出力されます。
0257948136
0258693147
0258693174
0286931475
0358297146
(中略)
9713068524
9741306825
9741306852
9742051863
10×10の盤のどの行にクイーンが配置されているかの結果が出力されていることは理解できています。
例えば最初の出力の0257948136は、0列目の0行目の位置、1列目の2行目の位置、2列目の5行目の位置、3列目7行目の位置....にクイーンが置かれていることを示している。
該当のソースコード
C言語
1#include <unistd.h> 2 3void outputchar(char c) 4{ 5 write(1, &c, 1); 6} 7 8int abs(int n) 9{ 10 if (n > 0) 11 return (n); 12 else 13 return (n * -1); 14} 15 16void alg(char *tab, int queen, int *t_out) 17{ 18 int i; 19 int j; 20 21 if (queen == 10) 22 { 23 queen = 0; 24 while (queen < 10) 25 outputchar(tab[queen++] + 48); 26 outputchar('\n'); 27 (*t_out)++; 28 return ; 29 } 30 i = -1; 31 while (++i < 10) 32 { 33 j = 0; 34 while (j < queen && i != tab[j] && abs(tab[j] - i) != queen - j) 35 j++; 36 if (j >= queen) 37 { 38 tab[queen] = i; 39 alg(tab, queen + 1, t_out); 40 } 41 } 42} 43 44int ten_queens_puzzle(void) 45{ 46 char arr[10]; 47 int que; 48 int total_out; 49 50 que = 0; 51 total_out = 0; 52 alg(arr, que, &total_out); 53 return (total_out); 54} 55 56int main(void) 57{ 58 ten_queens_puzzle(); 59 return (0); 60} 61

回答2件
あなたの回答
tips
プレビュー