zoukankan      html  css  js  c++  java
  • HDU 2612 -Find a way (注重细节BFS)

    主题链接:Find a Way

    题目不难,前几天做,当时准备写双向BFS的,后来处理细节上出了点问题,赶上点事搁置了。今天晚上重写的,没用双向,用了两次BFS搜索,和双向BFS 道理差点儿相同。仅仅是这题有个小坑,须要注意

    1.Y不能经过M。M不能经过Y。也就是说有Y和M的格子,能够默觉得是墙

    2.必须是Y和M都能到达的KFC才行,仅仅是当中一个到达不行


    比例如以下列数据;答案既不是22 也不是 88 而是110,左下角的KFC满座条件

    5 5
    Y..#@
    ...M.
    ....#
    .....
    @....
    小小的坑我了一下。

    。。

    感谢昵称: zstu_JayYe杰 不是看了他在Discuss板里的留言。预计我也想不到

    31MS 852K

    代码非常渣,哗哗。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <queue>
    const int N = 1e6;
    const int M = 220;
    using namespace std;
    char mapp[M][M];
    bool vis1[M][M],vis2[M][M];
    int dis1[M][M],dis2[M][M],n,m,l;
    struct node
    {
    	int x,y,a;
    	node()
    	{  x = 0; y = 0;a = 0;  }
    };
    struct noDe{
        int x,y;
    }kfc[40010];
    int mv[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
    void BFS(int x,int y,bool visit[M][M],int ans[M][M])
    {
        node f,t;
        queue<node>q;
        visit[x][y]=true;
        f.a = 0;
    	f.x=x;
    	f.y=y;
    	q.push(f);
    	while(!q.empty())
    	{
            t = q.front();
    		 q.pop();
    		 if(mapp[t.x][t.y]=='@')
                 ans[t.x][t.y] = t.a;
    		 for(int i=0;i<4;i++)
    		 {
    			 f.x=t.x+mv[i][0];
    			 f.y=t.y+mv[i][1];
    			 if(!visit[f.x][f.y]&&0<=f.x&&f.x<n&&0<=f.y&&f.y<m&&mapp[f.x][f.y]!='#')
    			 {
    				 f.a = t.a + 1;
    				 visit[f.x][f.y]=true;
    				 q.push(f);
    			 }
    		 }
    	}
    }
    int main()
    {
    	int sx,sy,ex,ey;
    	int minn;
    	while(~scanf("%d%d%*c",&n,&m))
    	{
    	    l = 0;
    		for(int i=0;i<n;i++)
            {
                scanf("%s",mapp[i]);
                for(int j=0;j<m;j++)
    		  {
    			if(mapp[i][j]=='Y')
    			{
    				sx=i;  sy=j;
    				mapp[i][j]='#';
    			}
    			else if(mapp[i][j]=='M')
    			{
    			    mapp[i][j]='#';
    				ex=i;  ey=j;
    			}
    			else if(mapp[i][j]=='@')
                {
                    kfc[l].x = i; kfc[l++].y = j;
                }
    		  }
            }
    		memset(vis1,0,sizeof(vis1));
         	memset(dis1,0,sizeof(dis1));
            BFS(sx,sy,vis1,dis1);
    		memset(vis2,0,sizeof(vis2));
         	memset(dis2,0,sizeof(dis2));
    		BFS(ex,ey,vis2,dis2);
    		minn=N;
    		for(int i = 0;i<l;i++)
            {
                if(minn > dis1[kfc[i].x][kfc[i].y] + dis2[kfc[i].x][kfc[i].y])
                    if(dis1[kfc[i].x][kfc[i].y]!=0&&dis2[kfc[i].x][kfc[i].y]!=0)
                    minn = dis1[kfc[i].x][kfc[i].y] + dis2[kfc[i].x][kfc[i].y];
            }
    		printf("%d
    ",minn*11);
    	}
    	return 0;
    }
    


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    2018-8-10-win10-uwp-按下等待按钮
    2018-8-10-win10-uwp-按下等待按钮
    2019-6-23-win10-uwp-应用放到桌面
    2019-6-23-win10-uwp-应用放到桌面
    PHP mysqli_get_client_info() 函数
    PHP mysqli_get_charset() 函数
    PHP mysqli_free_result() 函数
    PHP mysqli_field_tell() 函数
    PHP mysqli_field_seek() 函数
    约束、视图、序列、伪列和索引
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4853707.html
Copyright © 2011-2022 走看看