hdu 4308 Saving Princess claire_ 广搜 多校联合赛第七题

一个广搜题,就多了一个p点的处理,我们在以起点为开始广搜 遇见第一个p时(这个p一定是理起点最近的点)再将多有的p点都爆搜出来,压入队列,然后正常广搜就ok啦!!

5000*10000貌似没有超int啊!!wa了一次,改成longlong过了,测试数据有问题???

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
char a[5005][5005];
long long map[5005][5005];
int r,c,t,sx,sy,ex,ey,sum,sign;
int dir[4][2]={1,0,0,1,-1,0,0,-1};
void bfs(int x,int y){
    queue<int> q;
    q.push(x);
    q.push(y);
    while(!q.empty()){
        int m=q.front();q.pop();
        int n=q.front();q.pop();
        for(int i=0;i<4;i++){
            int mm=m+dir[i][1];
            int nn=n+dir[i][0];
            if(mm>=0&&mm<r&&nn>=0&&nn<c&&a[mm][nn]!='#'&&map[mm][nn]==0){
                if(a[mm][nn]!='P'){
                    if(a[mm][nn]=='*'){
                        map[mm][nn]=map[m][n]+t;
                        q.push(mm);
                        q.push(nn);
                    }
                    if(a[mm][nn]=='C'){
                        sign=1;//标记是否找到终点
                        map[mm][nn]=map[m][n];
                        return ;
                    }
                }
                else if(a[mm][nn]=='P'){
                    for(int i=0;i<r;i++){
                        for(int j=0;j<c;j++){
                            if(i==mm&&j==nn) continue;
                            if(a[i][j]=='P'){//搜索所有p点,加入队列,
                                a[i][j]='!';//防止第二次又搜到p点
                                q.push(i);
                                q.push(j);
                                map[i][j]=map[m][n];
                            }
                        }
                    }
                }
            }
        }
    }
}
int main(){
    while(~scanf("%d%d%d",&r,&c,&t)){
        for(int i=0;i<r;i++)
            scanf("%s",a[i]);
        for(int i=0;i<r;i++){
            for(int j=0;j<c;j++){
                map[i][j]=0;
                if(a[i][j]=='Y'){
                    sx=i;sy=j;
                }
                if(a[i][j]=='C'){
                    ex=i;ey=j;
                }
            }
        }
        sign=0;
        sum=0;
        bfs(sx,sy);
        if(sign==0) printf("Damn teoy!\n");
        else cout<<map[ex][ey]<<endl;
    }
}


你可能感兴趣的:(c,测试)