二次元配列の応用:エイトクィーン問題

内容:クイーン 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 つずつ記載しません)

おすすめ

転載: blog.csdn.net/weixin_54474126/article/details/121732773