目录
内容:
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);//求解。
}