锰锌求调
查看原帖
锰锌求调
89667
SentoAyaka楼主2022/11/12 16:06

deque最短路代码wa了

#include<bits/stdc++.h>
#define il inline
#define db double
// #define int ll
#define ll long long
#define ull unsigned long long
#define pb emplace_back
#define MP make_pair
#define pii pair<int,int>
#define fi first
#define se second
#define ls k<<1
#define rs k<<1|1
#define CLK (double)clock()/(double)CLOCKS_PER_SEC
using namespace std;
mt19937 rnd(time(0));
inline int read(){
	register int x=0,f=1;
	register char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
inline void write(register int x){
	if(x<0){putchar('-');x=-x;}
	if(x>9)write(x/10);
	putchar(x%10+'0');
}
const int N=4e5+5,inf=1e9;
const int dx[4]={1,1,-1,-1};
const int dy[4]={1,-1,1,-1};
int n,m,dis[N],vis[N];
pii pre[N];
string s[N];
int get(int x,int y){return (x-1)*m+y;}
bool chk(int tx,int ty){
    if(tx<1||tx>n||ty<1||ty>m||(s[tx][ty]=='.'&&(s[tx][ty+1]=='#'||s[tx][ty-1]=='#'||s[tx+1][ty]=='#'||s[tx-1][ty]=='#')))return 0;
    else return 1;
}
void solve(){
    deque<pii>q;
    n=read();m=read();
    for(int i=1;i<=n;i++)s[i]="",cin>>s[i],s[i]="0"+s[i];
    memset(dis,0x3f,sizeof dis);
    memset(vis,0,sizeof vis);
    memset(pre,0,sizeof pre);
    for(int i=1;i<=n;i++){
        int id=get(i,1);vis[id]=1;
        if(s[i][1]=='.'&&chk(i,1))dis[id]=1,vis[id]=1,q.push_back(MP(i,1));
        if(s[i][1]=='#')dis[id]=0,vis[id]=1,q.push_front(MP(i,1));
    }
    while(!q.empty()){
        pii x=q.front();q.pop_front();
        // cout<<x.fi<<' '<<x.se<<' '<<dis[get(x.fi,x.se)]<<"\n";
        for(int k=0;k<4;k++){
            int tx=x.fi+dx[k],ty=x.se+dy[k],id=get(tx,ty);
            if(vis[id]||!chk(tx,ty))continue;
            // cout<<x.fi<<' '<<x.se<<' '<<tx<<' '<<ty<<"\n";
            vis[id]=1;
            if(s[tx][ty]=='.')dis[id]=dis[get(x.fi,x.se)]+1,pre[id]=x,q.push_back(MP(tx,ty));
            else dis[id]=dis[get(x.fi,x.se)],pre[id]=x,q.push_front(MP(tx,ty));
        }
    }
    int ans=inf;pii res;
    for(int i=1;i<=n;i++)if(dis[get(i,m)]<ans)ans=dis[get(i,m)],res=MP(i,m);
    if(ans==inf){puts("NO");return ;}
    while(1){
        int x=res.fi,y=res.se;s[x][y]='#';
        res=pre[get(x,y)];if(res==MP(0,0))break;
    }
    puts("YES");
    for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)cout<<s[i][j];cout<<"\n";}
}
signed main(){   
	// freopen("read.in","r",stdin);
	// freopen("write.out","w",stdout);
    int T=read();while(T--)solve();
    // printf("\nTIME:%lf\n",(double)clock()/CLOCKS_PER_SEC);
	return 0;
}


2022/11/12 16:06
加载中...