菜鸡解N皇后问题
菜鸡能有什么好想法?暴力就完了。
**
题目
**
在一张N∗N的国际象棋棋盘上,放置N个皇后,使得所有皇后都无法互相直接攻击得到,(皇后可以直接攻击到她
所在的横行,竖列,斜方向上的棋子),现在输入一个整数N,表示在N∗N的棋盘上放N个皇后,请输出共有多少种使
得所有皇后都无法互相直接攻击得到的方案数。 例如下面这样的摆法,是4皇后的一个解 (1代表有皇后,0代表没有)
0 1 0 0
0 0 0 1
1 0 0 0
0 0 1 0
输入一个整数 N
输出能使得在N∗N的国际象棋棋盘上放置N个皇后,并且所有皇后都无法互相直接攻击得到的方案数
样例输入
样例输入1:
4
样例输入2:
8
样例输出
样例输出1
2
样例输出2
92
暴力思路:
观察规律感觉类似于全排列的变式,将全排列中数字出现的顺序看作X坐标,数字大小为Y坐标,所有皇后的排列情况即可表示出来。
限制条件:皇后攻击范围为米字,从坐标中体现为X值、Y值不能相同。在过皇后坐标斜率为正负一的直线上不能有棋子。X、Y方向由于看作数字全排列问题则不可能相等故无需考虑。对于斜线上情况能够相互攻击的条件为X+Y=n或X-Y=m,两棋子m或n相同。故两棋子取到的m、n值不能相同。
代码:
#include<stdio.h>
int n, num = 0;
char map[50][50];//象棋棋盘
bool b[50], c[50], d[50];//斜率为1的限制值 斜率为-1的限制值 行限制值
void dfs(int m)
{
if (n == m)
{
num++;
return;
}
for (int i = 0; i < n; i++)
{
if (!d[i] && !b[i + m] && !c[i - m + n])
{
map[m][i] = '1';
d[i] = b[i + m] = c[i - m + n] = true;
dfs(m + 1);
d[i] = b[i + m] = c[i - m + n] = false;
map[m][i] = '0';
}
}
}
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
map[i][j] = '0';
}
}
dfs(0);
printf("%d", num);
return 0;
}