/*八皇后*/
#include<iostream>
#include<vector>//使用向量保存皇后
#include<Windows.h>
using namespace std;
HANDLE handle;
const short NUM = 5;//皇后的数量
class Queen
{
public:
short x;//x轴坐标
short y;//y轴坐标
Queen(short _x = 0, short _y = 0) :x(_x), y(_y) {};
bool Attack(Queen& queen)//传入的是变量名的引用名,操作引用名就相当于操作变量本身;能相互攻击返回true
{
return (x == queen.x || x - y == queen.x - queen.y || x + y == queen.x + queen.y||y == queen.y);
}
};
void PrintQueens(vector<Queen>& v)
{
cout << "发现新的八皇后摆法:\n";
short i, j;
vector<Queen>::iterator itr = v.begin();
for (i = 0; i < NUM; i++)//对各行进行遍历
{
for (j = 0; j < NUM; j++)
{
if (itr<v.end()&&i == itr->y && j == itr->x)
{
SetConsoleTextAttribute(handle, FOREGROUND_RED | FOREGROUND_INTENSITY);
cout << "后";
SetConsoleTextAttribute(handle, FOREGROUND_RED | FOREGROUND_BLUE|FOREGROUND_GREEN);
itr++;
}
else
cout << "空";
}
cout << endl;
}
cout << endl;
}
int main()
{
handle = GetStdHandle(STD_OUTPUT_HANDLE);
vector<Queen> vt;
short i, j;
vector<Queen>::iterator itr;
Queen* q;
for (i = 0; i < NUM; i++)//行遍历
{
j = 0;
Repeat:
for (; j < NUM; j++)//列遍历
{
q = new Queen(j, i);//建立新皇后
for (itr = vt.begin(); itr != vt.end(); itr++)//将新建的皇后q和已进入向量的各个皇后进行互吃测试
if (q->Attack(*itr))
{
delete q;//释放不可用皇后所占的内存空间
break;
}
if (itr == vt.end())//q不与向量中的任何皇后相冲突
{
vt.push_back(*q);//皇后q纳入向量
delete q;
if (vt.size() == NUM)
{
PrintQueens(vt);//输出摆法
j = NUM;//人为的将j赋值为8,使流程接下来可以进入if(j==8)代码块去回溯重试
}
break;//退出列遍历,直接去测试下一行的第一列
}
}
if (j == NUM)//当前这一行一整行都不能安放皇后
{
if (vt.back().x == NUM-1)
vt.pop_back(); //vt.back()读取向量最后一个元素;vt.pop_back()弹出最后一个元素
if (!vt.empty())
{
i = vt.back().y;
j = vt.back().x + 1;
vt.pop_back();
goto Repeat;
}
}
}
return 0;
}
c++入门小程序:3.八皇后
最新推荐文章于 2025-05-16 08:17:19 发布