二维数组的应用:八皇后问题

这篇博客介绍了八皇后问题的解决方案,通过使用回溯算法来确保在8x8的棋盘上任意两个皇后不位于同一行、同一列或同一对角线上。博主详细阐述了算法分析、概要设计,并提供了C语言实现的代码。在每一步放置皇后时,会检查当前位置是否符合要求,如果不可行则回溯到上一行寻找其他可能的位置。最后,当找到可行解时,会输出解的数目及棋盘状态。
摘要由CSDN通过智能技术生成

内容:八皇后问题:在一个8*8格的国际象棋棋盘上,安放八个皇后(任意两个皇后不能在同一行、同一列、同一对角线上),写一个程序求出所有的解。

步骤:

算法分析:

任意两个皇后不能在同一行,将第i个皇后放在第i行后,只需要考虑它与前i-1个皇后处于不同的列和不同的对角线上即可。可采取回溯的算法,从上至下一次在每一行放置皇后,进行搜索,若在某一行的任意一列放置皇后后不能满足要求,则不再向下搜索,而进行回溯,回溯至有其他列可放置皇后的一行,再向下搜索,直到搜索到最后一行,找到可行解,输出结果。

概要设计:

Check()函数

判断皇后所放位置是否可行

Output()函数

输出可行解

EightQueen()函数

采用递归算法实现在row行放置皇后

代码如下:

#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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值