HDU 2612-Find a way(c语言版)

题目:https://vjudge.net/problem/HDU-2612#author=zhang95986

分析:经典bfs,具体见代码。

#include <stdio.h>
#include <string.h>
int n,m;
char c[201][201]; 
int f[201][201];//标记 
int tbs[201][201][2];//到达土拨鼠的位置时间
int l[40100][3];//模拟队列 
int q[5]={0,-1,0,1,0},p[5]={0,0,1,0,-1};//移动
int check(int x,int y){
    if(x>=0&&x<n&&y>=0&&y<m&&c[x][y]!='#'&&f[x][y]==0)
    return 1;
    else return 0;
}
void bfs(int x,int y,int z){//z确定哪个人 
    memset(l,0,sizeof(l));
    memset(f,0,sizeof(f));
    f[x][y]=1;
    int h=0,r=1;
    l[h][0]=x;
    l[h][1]=y;
    l[h][2]=0;
    int x1,y1;
    while(h<r){
    for(int i=1;i<=4;i++){
        x1=l[h][0]+p[i];
        y1=l[h][1]+q[i];
        if(check(x1,y1)){
            f[x1][y1]=1;
            l[r][0]=x1;
            l[r][1]=y1;
            l[r][2]=l[h][2]+1;
            r++;
            if(c[x1][y1]=='@'){
                if(z==0)tbs[x1][y1][0]=l[h][2]+1;
                else tbs[x1][y1][1]=l[h][2]+1;
            }
        }
    }
    h++;
}
}
int main(void){
    while(scanf("%d",&n)!=EOF){
        scanf("%d",&m);
        int x1=-1,y1=-1,x2=-1,y2=-1;//两人坐标 
        memset(c,'\0',sizeof(c));
        memset(f,0,sizeof(f));
        memset(tbs,0,sizeof(tbs));
        memset(l,0,sizeof(l));
        for(int i=0;i<n;i++)scanf("%s",c[i]);
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(c[i][j]=='Y'){
                    x1=i;y1=j;
                }
                if(c[i][j]=='M'){
                    x2=i;y2=j;
                }
            }
        }
        //for(int i=0;i<n;i++){
        //    for(int j=0;j<m;j++){
        //        printf("%c",c[i][j]);
        //    }
    //    printf("\n");
    //    }
    //    printf("%d %d %d %d",x1,y1,x2,y2);
        bfs(x1,y1,0);
        bfs(x2,y2,1);
        int min=100000000;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(tbs[i][j][0]!=0){
                //    printf("%d %d",tbs[i][j][0],tbs[i][j][1]);
                    int sum=11*(tbs[i][j][0]+tbs[i][j][1]);
                    if(sum<min)min=sum;
                }
            }
        }
        printf("%d\n",min); 
    }
    return 0;
}

 

posted @ 2020-02-13 15:52  yanying  阅读(138)  评论(0编辑  收藏  举报