栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

利用C语言实现N皇后

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

利用C语言实现N皇后

 

内容:

在n*n格的国际象棋棋盘上,安放n个皇后,要求,没有一个皇后能够“吃掉”任何其他皇后,即任意两个皇后不能处于同一行、同一列或同一对角线上,这样的格局成为一个解。写出一个程序可以求出所有解。

步骤

1.算法分析

程序中需要的三个重要函数:

        函数check()用来判断皇后所放的位置(row,column)是否可行;

        函数output()用来输出可行解,即输出棋盘;

        函数Nqueen()采用递归算法实现在row行放置皇后。

        对于八皇后问题的求解可采用回溯算法,从上至下依次在每一行放置皇后,进行探索,若在某一行的任意一列放置皇后均不能满足要求,则不能再向下搜索,而进行回溯,回溯至有其他列可以放置皇后的一行,再向下进行搜索,直至搜索至最后一行,找到可行解,输出结果。

2.代码

#include
#include
typedef int boolean;
#define true 1
#define false 0
int num = 0;
int n;
char m[100][100] = { '*' };


boolean 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 < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			printf("%c", m[i][j]);
		}
		printf("n");
	}
}


void NQueen(int row)
{
	int j;
	for (j = 0; j < n; j++)
	{
		m[row - 1][j] = 'Q';
		if (Check(row, j + 1) == true)
		{
			if (row == n)Output();
			else NQueen(row + 1);
		 
		}
		m[row - 1][j] = '*';

	}
}

void main()
{
	printf("100皇后以后无法运算n");
	printf("请输入需要的皇后数;");
	scanf_s("%d", &n);
	if (n <= 100) {
		NQueen(1);
	}
	else
		printf("无法运算!!!!");
}

3.流程图

4.效果图

 

 

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/352821.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号