n皇后问题

目录

内容:

算法分析

概要设计 

代码


内容:

        n皇后问题。 要求n皇后在nxn的棋盘上面,任意两个皇后不能处于同一行、同一列或同一对角线上。

算法分析

        对于n皇后问题,同样也是需要用到回溯算法的例题。对于n位皇后首先需要输入确定,在其前,定义一个足够大的n×n的棋盘,以至于放多少位皇后都能够放得下,接下来的步骤和8皇后问题的相同,也都是要判断任意一列的皇后的位置是否满足同一行,同一列和同一条对角线上不能够在。其他与八皇后也相同向下搜索,直到搜索到第n行,最后找到可行解,输出其结果即可。

概要设计 

函数

函数Check(int row,int column,int n) int

函数Output(int n) void

函数nQueen(int row,int n) void

代码

#include<stdio.h>
#include<stdlib.h>
#define ture 1;
#define false 0;
int num = 0;//解数目

char  m[100][100] = { '*' };//m[100][100],表示棋盘最大为100行100列,初始为*,表示未放置皇后,放置皇后应小于等于100
int Check(int row, int column,int n)
{
	int i, j;
	if (row == 1)
		return ture;
	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 <= n-1)
	{
		if (m[i][j] == 'Q')
			return false;
		//向右上方移动判断位置
		i--;
		j++;
	}
	return ture;
}
void Output(int n)//当已经放置n皇后以后,则为可行解,输出棋盘。
{
	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]);//输出n皇后
		}
		printf("\n");
	}
}
void nQueen(int row,int n)
{
	int j;
	for (j = 0; j < n; j++)//考虑在第row行的割裂放置皇后
	{
		m[row - 1][j] = 'Q';//在其中一列中放置皇后
		if (Check(row, j + 1,n) == true)//检查在该列放置皇后是否可行
		{
			if (row == n) Output(n);//若该列可放置皇后,且该列为最后一列,则找到可行解,输出
			else  nQueen(row + 1,n);//该列可放置皇后,则向下一行继续搜索,求解。
		}//取出该列的皇后,进行回溯,在其他列放置皇后
		m[row - 1][j] = '*';
	}
}
void main()
{
	int n;
	printf("请输入你想要放入多少位皇后(皇后最多为100):");
	scanf_s("%d", &n);
	printf("\n");
	nQueen(1,n);//求解。
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值