【C++】20191205 八皇后问题

数据结构:八皇后问题

【八皇后问题】
在8*8的棋盘上放置8个皇后,使其各行各列均只有一个皇后
输出所有可能的结果

#include <iostream>
#include <iomanip>
#include "stdio.h"
#include "string.h"
#include "stdlib.h"


using namespace std;
int result[100][8][8] = { 0 };
int sum = 0;//总次数计数

bool resCmp(int* queen) // 比较函数
{
	for (int i = 0; i < sum; i++)
	{
		for (int j = 0; j < 8; j++)
		{
			if (!memcmp(queen, result[i][j], 8 * sizeof(int))) // 内存比较
				return false;
		}
	}
	return true;
}

void EightQueen(int* queen, int cnt)// queen:皇后位置数组,cnt:这次设置第cnt行
{
	if (cnt == 8) // 尝试第9行,则可能性+1,停止递归
	{
		if (resCmp(queen))
		{
			for (int j = 0; j < 8; j++)
			{
				result[sum][0][j] = queen[j];

				result[sum][1][7 - queen[j]] = j;     // 90度旋转
				result[sum][2][7 - j] = 7 - queen[j];   // 180度旋转
				result[sum][3][queen[j]] = 7 - j;     // 270度旋转

				result[sum][4][j] = 7 - queen[j];     // 左右调换
				result[sum][5][7 - j] = queen[j];     // 上下调换
				result[sum][6][7 - queen[j]] = 7 - j;   // 左上-右下调换
				result[sum][7][queen[j]] = j;       // 左下-右上调换
			}

			printf_s("NO.%d:\n", sum + 1);

			for (int j = 0; j < 8; j++)
			{
				for (int k = 0; k < 8; k++)
				{
					if (result[sum][0][j] == k)
						printf_s("■");
					else
						printf_s("□");
				}
				printf_s("\n");
			}
			printf_s("\n");

			sum++;
		}
	}
	for (int i = 0; i < 8; i++) // 从第1列开始尝试到第8列
	{
		bool flag = true;
		for (int j = 0; j < cnt; j++) // 与前面0-cnt-1行的皇后进行检测,因为j不会等于cnt,因此两个皇后必不在同一行
		{
			if (i == queen[j] || j - cnt == queen[j] - i || j + queen[j] == i + cnt) // i == queen[j]:是否在同一列,j-cnt == queen[j]-i:是否在同一捺斜线,j+queen[j] == i+cnt:是否在同一撇斜线
			{
				flag = false; // 有冲突则进行下个位置的尝试
				break;
			}
		}
		if (flag) // 无冲突则递归设置下一行的皇后
		{
			queen[cnt] = i; // 设置此行皇后位置
			
			EightQueen(queen, cnt + 1); // 递归
			queen[cnt] = 0; // 恢复现场
		}
	}
}
int main()
{
	int* queen = new int[5];
	memset(queen, 0, 5 * sizeof(int));
	EightQueen(queen, 0);
	cout << sum << endl; // 输出结果
	return 0;
}

【运行结果】
NO.1:
■□□□□□□□
□□□□■□□□
□□□□□□□■
□□□□□■□□
□□■□□□□□
□□□□□□■□
□■□□□□□□
□□□■□□□□

NO.2:
■□□□□□□□
□□□□□■□□
□□□□□□□■
□□■□□□□□
□□□□□□■□
□□□■□□□□
□■□□□□□□
□□□□■□□□

NO.3:
□■□□□□□□
□□□■□□□□
□□□□□■□□
□□□□□□□■
□□■□□□□□
■□□□□□□□
□□□□□□■□
□□□□■□□□

NO.4:
□■□□□□□□
□□□□■□□□
□□□□□□■□
■□□□□□□□
□□■□□□□□
□□□□□□□■
□□□□□■□□
□□□■□□□□

NO.5:
□■□□□□□□
□□□□■□□□
□□□□□□■□
□□□■□□□□
■□□□□□□□
□□□□□□□■
□□□□□■□□
□□■□□□□□

NO.6:
□■□□□□□□
□□□□□■□□
■□□□□□□□
□□□□□□■□
□□□■□□□□
□□□□□□□■
□□■□□□□□
□□□□■□□□

NO.7:
□■□□□□□□
□□□□□■□□
□□□□□□□■
□□■□□□□□
■□□□□□□□
□□□■□□□□
□□□□□□■□
□□□□■□□□

NO.8:
□■□□□□□□
□□□□□□■□
□□■□□□□□
□□□□□■□□
□□□□□□□■
□□□□■□□□
■□□□□□□□
□□□■□□□□

NO.9:
□■□□□□□□
□□□□□□■□
□□□□■□□□
□□□□□□□■
■□□□□□□□
□□□■□□□□
□□□□□■□□
□□■□□□□□

NO.10:
□□■□□□□□
□□□□■□□□
□■□□□□□□
□□□□□□□■
■□□□□□□□
□□□□□□■□
□□□■□□□□
□□□□□■□□

NO.11:
□□■□□□□□
□□□□■□□□
□□□□□□□■
□□□■□□□□
■□□□□□□□
□□□□□□■□
□■□□□□□□
□□□□□■□□

NO.12:
□□■□□□□□
□□□□□■□□
□■□□□□□□
□□□□■□□□
□□□□□□□■
■□□□□□□□
□□□□□□■□
□□□■□□□□

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值