[CodeForces445A]DZY Loves Chessboard[bfs]

题目链接:[CodeForces445A]DZY Loves Chessboard[BFS]

题意分析:棋盘上有好的点和坏的点,DZY只能在好的点放置棋子,棋子总共就两种颜色:黑和白。问:给出一个棋盘,放满整个棋盘上好的点,使得同种颜色的棋子没有公共边(保证至少有一个解)

解题思路:默认初始点放置黑棋,然后把该点加入队列,更新四周的点为白旗,接着把四周的点加入队列,接着更新四周为不同颜色的点。

个人感受:一开始直接和以前做搜索一样,添加点,然后判断周围的点的颜色再确定当前点的颜色。各种WA。思维太固定了!

具体代码如下:

#include <iostream>
#include <queue>
using namespace std;

struct Node{
    int x, y;
};

char a[111][111];
int dir[2][4] = {0, 1, 0, -1, 1, 0, -1, 0};
int n, m;
queue<Node> q;

void bfs(int x, int y)
{
    q.push(Node{x, y});
    while (!q.empty())
    {
        Node e = q.front(); q.pop();
        char judge = a[e.x][e.y] == 'B' ? 'W' : 'B'; //确定周围点颜色
        for (int i = 0; i < 4; ++i)
        {
            int nx = e.x + dir[0][i], ny = e.y + dir[1][i];
            if (0 <= nx && nx < n && 0 <= ny && ny < m && a[nx][ny] == '.')
            {
                a[nx][ny] = judge;
                q.push(Node{nx, ny});
            }
        }
    }
}

int main()
{
    cin >> n >> m;
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < m; ++j)
            cin >> a[i][j];
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < m; ++j)
            if (a[i][j] == '.')
            {
                a[i][j] = 'B'; //默认黑先(纯粹个人喜好)
                bfs(i, j);
            }
    for (int i = 0; i < n; ++i)
        cout << a[i] << '\n';
    return 0;
}

你可能感兴趣的:(图论,codeforces,bfs)