目前还差第二个测试点过不了(超时),不知道应该如何进一步优化...
  • 板块P1141 01迷宫
  • 楼主Leungyh
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/3/24 21:08
  • 上次更新2023/10/28 05:46:14
查看原帖
目前还差第二个测试点过不了(超时),不知道应该如何进一步优化...
585521
Leungyh楼主2022/3/24 21:08
#include<bits/stdc++.h>

using namespace std;

char room[1010][1010];
bool visited[1010][1010];
int flag[1010][1010];
int sum[1000010];
int direct[4][2] = {{-1,0},{0,-1},{1,0},{0,1}};
int n,m;
int num;
int cnt = 1;

struct node
{
    int x,y;
};

bool check_border(int x,int y)
{
    if(x>=1&&x<=n&&y>=1&&y<=n)
        return 1;
    else
        return 0;
}

bool check_flag(node m1,node m2)
{
    if(room[m1.x][m1.y] != room[m2.x][m2.y])
        return 1;
    else
        return 0;
}

void BFS(int x,int y)
{
    memset(visited,0,sizeof(visited));
    num = 1;
    queue<node>q;
    node now,next;
    now.x = x;
    now.y = y;
    q.push(now);
    visited[x][y] = 1;
    flag[x][y] = cnt;
    while(!q.empty())
    {
        now = q.front();
        q.pop();
        for(int i=0;i<4;i++)
        {
            next.x = now.x + direct[i][0];
            next.y = now.y + direct[i][1];
            if(room[next.x][next.y] == room[now.x][now.y]) continue;
            if(visited[next.x][next.y]) continue;
            if(!check_border(next.x,next.y)) continue;
            visited[next.x][next.y] = 1;
            flag[next.x][next.y] = cnt;
            num++;
            q.push(next);
        }
    }
    sum[cnt++] = num;
}

int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cin>>room[i][j];
    int x,y;
    for(int i=1;i<=m;i++){
        scanf("%d%d",&x,&y);
        if(sum[flag[x][y]]==0)
            BFS(x,y);
        printf("%d\n",sum[flag[x][y]]);
    }
}

2022/3/24 21:08
加载中...