80%求优化

P1141 01迷宫

you131 @ 2024-07-11 21:04:18

//思路:
//bfs
//遍历一次+1
//重点:连通的最后的值都是一样的,所以vis不需要重置 
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int n,m;
int f[N][N];  //表示迷宫
int vis[N][N]; //访问标记 
int x[4]={-1,0,1,0};    //上右下左 
int y[4]={0,1,0,-1};
int ans[N][N]; //记录结果 
int c=0; //使用bfs的次数 
void bfs(int a,int b){  //a和b表示开始节点,返回访问节点数
    queue<pair<int,int> > q;
    int res=1;
    c++;
//  memset(vis,0,sizeof(vis)); 
    q.push(make_pair(a,b));
    vis[a][b]=c;
    while(!q.empty()){
        pair<int,int> t=q.front(); //取栈顶元素
        q.pop(); 
        for(int i=0;i<4;i++){
            int a1=t.first+x[i];
            int b1=t.second+y[i];
            if(!vis[a1][b1]&&a1>0&&a1<=n&&b1>0&&b1<=n){
                if(f[a1][b1]!=f[t.first][t.second]){
                    vis[a1][b1]=c;
                    res++;
                    q.push(make_pair(a1,b1));
                }
            }
        } 
    } 
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(vis[i][j]==c)
                ans[i][j]=res;
        }
    }
}
int main(void){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        string s;
        cin>>s;
        for(int j=0;j<s.size();j++)
            f[i][j+1]=s[j]-'0';
    }
    int res=0; 
    for(int i=1;i<=m;i++){
        if(i!=1) cout<<endl;
        int a,b;
        cin>>a>>b;
        if(ans[a][b]==0)
            bfs(a,b);
        cout<<ans[a][b]; 
    }
    return 0;
} 

by you131 @ 2024-07-11 21:06:05

主要问题是超时,有两个样例通不过


|