您的位置:首页 > 其它

蓝桥-BASIC-27-2n皇后问题

2017-05-31 00:58 316 查看
ACM模版

描述



题解

一道水题,本来不打算写,但是发现是经典的8皇后问题的延伸,感觉挺不错的,所以写写玩……想当初最开始学习 dfs 就是通过八皇后问题来学习的。

依然是逐行判断,不过需要同时放两个皇后才能继续深入搜索……

代码

#include <iostream>
#include <queue>
#include <cstring>
#include <cstdio>

using namespace std;

const int MAXN = 10;

int map[MAXN][MAXN];
int visB[MAXN];
int visW[MAXN];

int n;
int cnt = 0;

bool charge(int row, int col, int tag)
{
if (map[row][col] != 1)
{
return false;
}
if (tag == 2 && visB[col])
{
return false;
}
if (tag == 3 && visW[col])
{
return false;
}
for (int i = 0; i < n; i++)
{
if (row - i > 0 && row - i <= n && col + i > 0 && col + i <= n)
{
if (tag == map[row - i][col + i])
{
return false;
}
}
}
for (int i = -n + 1; i < 0; i++)
{
if (row + i > 0 && row + i <= n && col + i > 0 && col + i <= n)
{
if (tag == map[row + i][col + i])
{
return false;
}
}
}
return true;
}

void dfs(int row)
{
if (row > n)
{
cnt++;
//        cout << cnt << '\n';
//        for (int i = 1; i <= n; i++)
//        {
//            for (int j = 1; j <= n; j++)
//            {
//                cout << map[i][j] << ' ';
//            }
//            cout << '\n';
//        }
return ;
}
for (int i = 1; i <= n; i++)
{
if (charge(row, i, 2))
{
map[row][i] = 2;
visB[i] = 1;
for (int j = 1; j <= n; j++)
{
if (charge(row, j, 3))
{
map[row][j] = 3;
visW[j] = 1;
dfs(row + 1);
map[row][j] = 1;
visW[j] = 0;
}
}
map[row][i] = 1;
visB[i] = 0;
}
}
}

int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
scanf("%d", map[i] + j);
}
}

dfs(1);

cout << cnt << '\n';

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  八皇后 dfs