内容:クイーン 8 個 問題: 8*8 マスのチェス盤に 8 個のクイーンを配置し (2 個のクイーンは同じ行、列、または対角線上に配置することはできません)、すべての解を見つけるプログラムを作成します。
ステップ:
アルゴリズムの分析:
i 番目のクイーンを i 番目の行の後に配置するには、最初の i-1 のクイーンとは別の列にあり、別の対角線上にあることを考慮する必要があります。バックトラッキングアルゴリズムを使用して、各行にクイーンを上から下に配置して検索できます.特定の行のどの列にもクイーンが配置され、要件を満たすことができない場合、検索は下に実行されず、バックトラックが実行されます. 、他の列が存在するまでバックトラック クイーンを配置できる行を探し、最後の行が見つかるまで下方向に検索し、実行可能な解が見つかり、結果が出力されます。
概略設計:
Check() 関数 |
女王の地位が実現可能かどうかを判断する |
Output() 関数 |
実行可能解を出力する |
エイトクイーン () 関数 |
再帰アルゴリズムを使用して、列にクイーンを配置します |
コードは以下のように表示されます:
#include <stdio.h>
#include <stdlib.h>
typedef int bool;
#define true 1
#define false 0
int num=0; //解的数目
char m[8][8]={'*'}; //表示棋盘
bool Check(int row,int column)
{
int i,j;
if(row==1)return true;
for(i=0;i<=row-2;i++) //纵向只能有一枚皇后
{
if(m[i][column-1]=='Q')return false;
}
/*左上至右下只能有一枚皇后*/
i=row-2;
j=i-(row-column);
while(i>=0&&j>=0)
{
if(m[i][j]=='Q')return false;
i--;
j--;
}
/*右上至左下只能有一枚皇后*/
i=row-2;
j=row+column-i-2;
while(i>=0&&j<=7)
{
if(m[i][j]=='Q')return false;
i--;
j++;
}
return true;
}
void Output() //为可行解时,输出结果
{
int i,j;
num ++;
printf("可行解 %d:\n",num);
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
printf("%c",m[i][j]);
}
printf("\n");
}
}
/*采用递归函数实现八皇后回溯算法*/
/*该函数求解当棋盘前row-1行已放置好皇后,在第row行放置皇后*/
void EightQueen(int row)
{
int j;
for(j=0;j<8;j++) //考虑在第row行的各列放置皇后
{
m[row-1][j]='Q'; //在其中一列放置皇后
if(Check(row,j+1)==true) //检查在该列放置皇后是否可行
{
if(row==8)Output(); //若该列放置皇后可行且该列为最后一列,则找到一解
else EightQueen(row+1); //若该列可放置皇后,则向下一行继续搜索、求解
} //取出该列皇后,进行回溯,在其他列放置皇后
m[row-1][j]='*';
}
}
void main()
{
EightQueen(1);
}
実行結果: (結果が多すぎるため、1 つずつ記載しません)