c++入门小程序:3.八皇后

/*八皇后*/
#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;
}

结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_60534571/article/details/130546775