数据结构:八皇后问题
【八皇后问题】
在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:
□□■□□□□□
□□□□□■□□
□■□□□□□□
□□□□■□□□
□□□□□□□■
■□□□□□□□
□□□□□□■□
□□□■□□□□