zoukankan      html  css  js  c++  java
  • 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,'',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("
    ");
        //    }
        //    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
    ",min); 
        }
        return 0;
    }
  • 相关阅读:
    深圳成为全球第一个100%电动公共汽车的城市
    layui 数据表格按钮事件绑定和渲染
    Layui 改变数据表格样式覆盖
    js 遍历删除数组
    layui 数据表格最简单的点击事件
    layui 数据表格使用
    Layui 解决动态图标不动的问题
    Js 改变时间格式输出格式
    PHP 面向对象的数据库操作
    PHP SQL预处理
  • 原文地址:https://www.cnblogs.com/yanying7/p/12303859.html
Copyright © 2011-2022 走看看