菜鸡解N皇后问题

菜鸡解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
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;
}

你可能感兴趣的:(dfs)