hdu3085 Nightmare Ⅱ( 字符一个一个读超慢啊 会tle 要一行一行读)

ac代码 微丑

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N=1010;
struct node{
    int x,y;
};
node z[2],m1,g;
char s[N][N];
int mp[N][N],tm1[N][N],tg[N][N];
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
int n,m;
int bfs(){
    queue<node>qm1,qg;
    qm1.push(m1),qg.push(g);
    tm1[m1.x][m1.y]=1,tg[g.x][g.y]=1;
    while(qm1.size()&&qg.size()){
        node tmp=qm1.front();
        int time=tm1[tmp.x][tmp.y];
        int uu=3; while(uu--){
            int k=qm1.size(); while(k--){
                node tmp=qm1.front(); qm1.pop();
                if(abs(tmp.x-z[0].x)+abs(tmp.y-z[0].y)<=2*time||abs(tmp.x-z[1].x)+abs(tmp.y-z[1].y)<=2*time) continue;
                for(int i=0;i<=3;i++){
                    int u=tmp.x+dx[i],v=tmp.y+dy[i];
                    if(u<0||u>=n||v<0||v>=m||mp[u][v]||tm1[u][v]) continue;
                    if(abs(u-z[0].x)+abs(v-z[0].y)<=2*time||abs(u-z[1].x)+abs(v-z[1].y)<=2*time) continue;
                    if(tg[u][v]) return time;
                    tm1[u][v]=time+1;
                    qm1.push({u,v});
                }
            }
        }
            int k=qg.size(); while(k--){
                node tmp=qg.front(); qg.pop();
                if(abs(tmp.x-z[0].x)+abs(tmp.y-z[0].y)<=2*time||abs(tmp.x-z[1].x)+abs(tmp.y-z[1].y)<=2*time) continue;
                for(int i=0;i<=3;i++){
                    int u=tmp.x+dx[i],v=tmp.y+dy[i];
                    if(u<0||u>=n||v<0||v>=m||mp[u][v]||tg[u][v]) continue;
                    if(abs(u-z[0].x)+abs(v-z[0].y)<=2*time||abs(u-z[1].x)+abs(v-z[1].y)<=2*time) continue;
                    if(tm1[u][v]) return time;
                    tg[u][v]=time+1;
                    qg.push({u,v});
                }
            }
    }
    return -1;
}
int main(){
    int t; scanf("%d",&t);
    while(t--){
        memset(mp,0,sizeof(mp));
        memset(tm1,0,sizeof(tm1));
        memset(tg,0,sizeof(tg));
        int ctz=-1;
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++) scanf("%s",s[i]);
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                char c; c=s[i][j];
                if(c=='X') mp[i][j]=1; 
                else if(c=='Z') z[++ctz]={i,j};
                else if(c=='M') m1={i,j};
                else if(c=='G') g={i,j};
            }
        }
       int ans=bfs();
       printf("%d\n",ans);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值