思路
采用深搜的思想,将每种放法都尝试一遍。主要注意要将每个点对应的行 列 正对角线 负对角线的表达方式找到。然后每次找到点后深搜下一个点结束后需要将这个点清除放置,即拿走这个点的皇后。
代码
#include <stdio.h>
#include <iostream>
#include <sstream>
#include <vector>
#include <string>
#include <stdlib.h>
#include <math.h>
#include <map>
#include <bitset>
using namespace std;
string s;
int r,A[15][15],lie[15],zuoxia[30],youshang[30];
int t = 0,Ans[6*6][6];
int check(int x,int y)//判断当前坐标是否可以放皇后
{
if(A[x][y]==0&&lie[y]==0&&zuoxia[x-y+r]==0&&youshang[x+y]==0)return 1;
else return 0;
}
int dfs(int x)//迭代每一行
{
if(x==r+1) //结束标志
{
t++;//记放置方案数
if(t<=3)
{
for(int i=1;i<=r;i++)
{
for(int j = 1;j<=r;j++)
{
if(A[i][j]==1&&i!=r)cout << j <<" ";
else if(A[i][j]==1&&i==r)cout << j <<endl;
}
}
}
return 0;
}
else
{
for(int i=1;i<=r;i++)//查找x行中每一列, 判断该 坐标是否可以放置皇后
{
if(check(x,i))
{
A[x][i] = 1; //当前点赋值为1表示这个点已占用
lie[i] = 1; //当前列赋值为1 表示此列已占用
zuoxia[x-i+r] = 1; //表示此点对应的正对角线已占用
youshang[x+i]= 1; //表示此点对应的负对角线已占有
dfs(x+1); //深搜下一行
A[x][i] = 0; //结束后清除这个坐标的标志,即回溯
lie[i] = 0;
zuoxia[x-i+r] = 0;
youshang[x+i]= 0;
}
}
}
}
int main()
{
int i,j;
cin >>r;
dfs(1);//从第一行开始查找每个坐标
cout << t;
return 0;
}