dfs+记忆化 #3没过看不出原因 求大佬帮调

P1141 01迷宫

silencer468 @ 2024-03-13 19:13:41


#include<iostream>
using namespace std;
int n,m;
string a1[1000];//地图
short book[1001][1001];
short fxx[]={1,-1,0,0};
short fyy[]={0,0,1,-1};
int f[100001];每个连通图的值
long long ans;
int d;//第几个连通图

void dfs(int x,int y){
    for(int i=0;i<4;i++){             
        int xx=fxx[i]+x,yy=fyy[i]+y;
        if(xx>=0&&xx<n&&yy>=0&&yy<n)
        if(a1[xx][yy]!=a1[x][y]&&book[xx][yy]==0){
            f[d]++;
            book[xx][yy]=d;
            dfs(xx,yy);
        }
    }
}

int main()
{                              
   cin>>n>>m;
    for(int i=0;i<n;i++){
        cin>>a1[i];
    }
    //用于记录是第几个连通图
    for(int i=0;i<m;i++){
        int x,y;
        cin>>x>>y;
        x--;y--;
        //如果是已探索过的连通图中,则直接输出答案
        if(book[x][y]==0){
            d++;
            ans=0;
            book[x][y]=d;
            f[d]++;
            dfs(x,y);
            cout<<f[book[x][y]]<<endl;
        }else cout<<f[book[x][y]]<<endl;
    }
    return 0;
}

by xxc123 @ 2024-03-15 20:59:47

@silencer468 ```c

include<iostream>

include<cstring>

include<cstdio>

using namespace std; int fx[5]={-1,0,0,1},fy[5]={0,-1,1,0},ans[100005]; bool mp[1050][1050]; int visited[1050][1050]; int s,n,m; void f(int x,int y,int sign,int v) { //cout<<x<<' '<<y<<' '<<sign<<endl; if(x<0||x>=n||y<0||y>=n) return; if(mp[x][y]==sign||visited[x][y]) return; s++; visited[x][y]=v; for(int i=0;i<4;i++) { f(x+fx[i],y+fy[i],mp[x][y],v); } return; } int main() { cin>>n>>m; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { char t; cin>>t; // cout<<"aa "<<t<<endl; mp[i][j]=t-'0'; } } for(int i=0;i<m;i++) { int x,y; cin>>x>>y; if(visited[x-1][y-1]) { cout<<ans[visited[x-1][y-1]]<<endl; }else { s=0; f(x-1,y-1,!mp[x-1][y-1],i+1); ans[i+1]=s; cout<<s<<endl; }
} return 0; }


by silencer468 @ 2024-03-15 23:53:06

@xxc123 佬,你的代码思路和我差不多,那我是错在哪里呢?


|