现在的位置: 首页 > 综合 > 正文

CF327D Block Tower

2013年09月26日 ⁄ 综合 ⁄ 共 1021字 ⁄ 字号 评论关闭

利用深搜处理连通块,只要不是第一级就一定可以建为红色。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 505;
const int DIR_X[] = {1, 0, -1, 0};
const int DIR_Y[] = {0, 1, 0, -1};

int n, m;
char map[MAXN][MAXN];
bool visit[MAXN][MAXN];

struct Node
{
    char op;
    int x, y;
    inline void output()
    {
        printf("%c %d %d\n", op, x, y);
    }
} node[MAXN * MAXN * 3];
int nodeNum;

inline void addNode(char op, int x, int y)
{
    node[nodeNum].op = op;
    node[nodeNum].x = x;
    node[nodeNum].y = y;
    ++nodeNum;
}

inline bool isInside(int x, int y)
{
    return x >= 1 && x <= n && y >= 1 && y <= m;
}

void dfs(int x, int y, int depth)
{
    visit[x][y] = true;
    addNode('B', x, y);
    for (int i = 0; i < 4; ++i)
    {
        int tx = x + DIR_X[i];
        int ty = y + DIR_Y[i];
        if (isInside(tx, ty))
        {
            if (map[tx][ty] == '.')
            {
                if (!visit[tx][ty])
                {
                    dfs(tx, ty, depth + 1);
                }
            }
        }
    }
    if (depth)
    {
        addNode('D', x, y);
        addNode('R', x, y);
    }
}

int main()
{
    while (~scanf("%d%d", &n, &m))
    {
        for (int i = 1; i <= n; ++i)
        {
            scanf("%s", map[i] + 1);
        }
        nodeNum = 0;
        memset(visit, false, sizeof(visit));
        for (int i = 1; i <= n; ++i)
        {
            for (int j = 1; j <= m; ++j)
            {
                if (map[i][j] == '.')
                {
                    if (!visit[i][j])
                    {
                        dfs(i, j, 0);
                    }
                }
            }
        }
        printf("%d\n", nodeNum);
        for (int i = 0; i < nodeNum; ++i)
        {
            node[i].output();
        }
    }
    return 0;
}

抱歉!评论已关闭.