P1141 01迷宫

题目描述

有一个仅由数字1组成的格迷宫。若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格上,那么你可以移动到相邻格中的某一格0上。

你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。

输入格式

1行为两个正整数

下面n行,每行个字符,字符只可能是0或者1,字符之间没有空格。

接下来行,每行个用空格分隔的正整数,对应了迷宫中第i行第列的一个格子,询问从这一格开始能移动到多少格。

输出格式

m行,对于每个询问输出相应答案。

#include <iostream>
#include <cstring>
using namespace std;
int n, m, ans[100002], x, y, f[1002][1002];
char map[1002][1002];
int nxe[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
void dfs(int x, int y, int flag, int step)
{
    if (x < 1 || x > n || y < 1 || y > n || f[x][y] != -1 || map[x][y] - '0' != flag)
    {
        return;
    }
    f[x][y] = step;
    ans[step]++;
    for (int i = 0; i <= 3; i++)
    {
        int nx = x + nxe[i][0];
        int ny = y + nxe[i][1];
        dfs(nx, ny, !flag, step);
    }
}
int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            cin >> map[i][j];
        }
    }
    memset(f, -1, sizeof(f));
    for (int i = 1; i <= m; i++)
    {
        cin >> x >> y;
        if (f[x][y] == -1)
        {
            dfs(x, y, map[x][y] - '0', i);
        }
        else
        {
            ans[i] = ans[f[x][y]];
        }
    }
    for (int i = 1; i <= m; i++)
    {
        cout << ans[i] << endl;
    }
    return 0;
}

 

posted @ 2022-01-14 15:59  亚托莉的亚托莉  阅读(27)  评论(0)    收藏  举报