ACM俱乐部 3918 营救小明

转载请注明出处:http://blog.csdn.net/a1dark

分析:赤裸裸的一道图搜索、正确的思路应该是以M为起点反过来搜F、看最先搜到F最少需要多少步、由于中间有怪物、应该用优先队列来实现、但是我想到了以前可以换方向直接BFS来水数据的方法、所以就直接水了、O(∩_∩)O哈哈~不要鄙视我、这样用时0MS、用优先队列最少都是4MS、嘿嘿!大笑

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=301;
int vis[maxn][maxn];
char mpt[maxn][maxn];
int que[maxn*100][2];
int dir[4][2]={-1,0,1,0,0,1,0,-1};
int n,m;
void bfs(int x,int y){
    memset(vis,0,sizeof(vis));
    vis[x][y]=1;
    int head=0;
    que[head][0]=x;
    que[head][1]=y;
    int tail=1;
    int minx=-1;
    while(head<tail){
        int x1=que[head][0];
        int y1=que[head][1];
        if(mpt[x1][y1]=='f'){
            minx=vis[x1][y1];
            break;
        }
        for(int i=0;i<4;i++){
            int tx=x1+dir[i][0];
            int ty=y1+dir[i][1];
            if(vis[tx][ty]==0&&tx>=1&&tx<=n&&ty>=1&&ty<=m&&mpt[tx][ty]!='#'){
                if(mpt[tx][ty]=='g'){
                    vis[tx][ty]=vis[x1][y1]+2;
                }
                else
                    vis[tx][ty]=vis[x1][y1]+1;
                que[tail][0]=tx;
                que[tail][1]=ty;
                tail++;
            }
        }
        head++;
    }
    if(minx==-1)printf("Poor Xiaoming\n");
    else
        printf("%d\n",minx-1);
}
int main(){
    int x0,y0;
    while(scanf("%d%d",&n,&m)!=EOF){
        memset(mpt,'\0',sizeof(mpt));
        memset(que,0,sizeof(que));
        for(int i=1;i<=n;i++){
            scanf("%s",mpt[i]+1);
            for(int j=1;j<=m;j++){
                if(mpt[i][j]=='m'){
                    x0=i;
                    y0=j;
                }
            }
        }
        bfs(x0,y0);
    }
    return 0;
}


你可能感兴趣的:(bfs,图搜索)