#include"stdafx.h"
#include<iostream>
#include<vector>
using namespace std;
#define Size 4//棋盘大小
vector<vector<int>>mark;//定义标记数组
vector<string>location;//定义放置数组
vector<vector<string>>result;//定义结果数组
const int dx[8]={1,-1,0,0,1,-1,1,-1};//方向数组
const int dy[8]={0,0,1,-1,1,-1,-1,1,};
void put_queen(int x,int y,vector<vector<int>>&mark)
{
mark[x][y]=1;
for(int i=1;i<Size;i++)//步长
{
for(int j=0;j<8;j++)//方向
{
int nextx=x+i*dx[j];
int nexty=y+i*dy[j];
if(nextx>=0&&nextx<Size&&nexty>=0&&nexty<Size)
mark[nextx][nexty]=1;//将该点的8个方向所有点标记为1
}
}
}
void queen_solution(int k,int n,vector<string>&location,vector<vector<int>>&mark,vector<vector<string>>&result)
{
if(k==n)//k为当前放置皇后的层数,若放置到了最后一层,则问题解决
{
result.push_back(location);//将当前放置结果保存
return;
}
for(int i=0;i<Size;i++)//从第0列开始遍历,查找可以放置皇后的点
{
if(mark[k][i]==0)//如果可以放置
{
vector<vector<int>>temp=mark;//备份标记数组
put_queen(k,i,mark);//放置皇后
location[k][i]='Q';//该点标记为Q
queen_solution(k+1,n,location,mark,result);//遍历下一层
mark=temp;//若放置失败,则还原标记数组
location[k][i]='.';//还原放置数组
}
}
}
int main()
{
for(int i=0;i<Size;i++)//初始化标记数组和放置数组
{
location.push_back("");
location[i].append(Size,'.');
mark.push_back(vector<int>());
for(int j=0;j<Size;j++)
{
mark[i].push_back(0);
}
}
queen_solution(0,Size,location,mark,result);
for(int i=0;i<result.size();i++)//输出结果数组
{
cout<<"solution:"<<i+1<<endl;
for(int j=0;j<result[i].size();j++)
cout<<result[i][j]<<endl;
cout<<endl;
}
system("pause");
return 0;
}
C++N皇后问题
最新推荐文章于 2024-05-21 16:34:42 发布