MLE求查错
查看原帖
MLE求查错
531319
thomaswmy楼主2022/10/10 16:16

写的正解,不知为何第25个点MLE了

马蜂比较奇怪

#include <bits/stdc++.h>
using namespace std;
const int N=2010;
const int dx[]={0,0,1,-1};
const int dy[]={1,-1,0,0};

int n,m;
char s[N][N];
bool vis[N][N],flag;
int deg[N][N];
int tot;
queue<pair<int,int> > q;

void dfs1(int x,int y) {
    tot++;
    deg[x][y]=0;
    vis[x][y]=1;
    for(int i=0;i<4;i++) {
        int vx=x+dx[i],vy=y+dy[i];
        if(vx<1 || vx>n || vy<1 || vy>m) continue;
        if(s[vx][vy]=='*') continue;
        deg[x][y]++;
        if(vis[vx][vy]) continue;
        dfs1(vx,vy);
    }
    if(deg[x][y]==1) q.push({x,y});
}

void dfs2(int x,int y) {
    flag&=s[x][y]!='.';
    vis[x][y]=0;
    for(int i=0;i<4;i++) {
        int vx=x+dx[i],vy=y+dy[i];
        if(vx<1 || vx>n || vy<1 || vy>m) continue;
        if(s[vx][vy]=='*') continue;
        if(!vis[vx][vy]) continue;
        dfs2(vx,vy);
    }
}

void dfs3(int x,int y) {
    vis[x][y]=1;
    for(int i=0;i<4;i++) {
        int vx=x+dx[i],vy=y+dy[i];
        if(vx<1 || vx>n || vy<1 || vy>m) continue;
        if(s[vx][vy]=='*') continue;
        if(vis[vx][vy]) continue;
        dfs3(vx,vy);
    }
}

int main() {
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) {
        scanf("%s",s[i]+1);
    }
    flag=1;
    for(int i=1;i<=n;i++) {
        for(int j=1;j<=m;j++) {
            if(s[i][j]=='*') continue;
            if(vis[i][j]) continue;
            while(!q.empty()) q.pop();
            tot=0;
            dfs1(i,j);
            if(q.empty() || (tot&1)) {
                flag=0;
                break;
            }
            while(!q.empty()) {
                int ux=q.front().first,uy=q.front().second;
                q.pop();
                int cnt=0;
                for(int k=0;k<4;k++) {
                    int vx=ux+dx[k],vy=uy+dy[k];
                    if(vx<1 || vx>n || vy<1 || vy>m) continue;
                    if(s[vx][vy]!='.') continue;
                    cnt++;
                    deg[vx][vy]--;
                    if(deg[vx][vy]==1) q.push({vx,vy});
                }
                if(s[ux][uy]=='.' && cnt!=1) {
                    flag=0;
                    break;
                }
                else if(s[ux][uy]=='.') {
                    for(int k=0;k<4;k++) {
                        int vx=ux+dx[k],vy=uy+dy[k];
                        if(vx<1 || vx>n || vy<1 || vy>m) continue;
                        if(s[vx][vy]!='.') continue;
                        if(k==0) s[ux][uy]='<',s[vx][vy]='>';
                        else if(k==1) s[ux][uy]='>',s[vx][vy]='<';
                        else if(k==2) s[ux][uy]='^',s[vx][vy]='v';
                        else s[ux][uy]='v',s[vx][vy]='^';
                        if(deg[vx][vy]!=1) q.push({vx,vy});
                    }
                }
            }
            dfs2(i,j);
            dfs3(i,j);
            if(!flag) break;
        }
        if(!flag) break;
    }
    if(!flag) printf("Not unique");
    else {
        for(int i=1;i<=n;i++) {
            for(int j=1;j<=m;j++) {
                printf("%c",s[i][j]);
            }
            printf("\n");
        }
    }
    return 0;
}
2022/10/10 16:16
加载中...