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\n",minn*11);
	}
	return 0;
}

HDU 2612 -Find a way (注意细节的BFS)

时间: 2024-10-14 10:27:45

HDU 2612 -Find a way (注意细节的BFS)的相关文章

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. ....# ..... @

BFS(最短路) HDU 2612 Find a way

题目传送门 1 /* 2 BFS:和UVA_11624差不多,本题就是分别求两个点到KFC的最短路,然后相加求最小值 3 */ 4 /************************************************ 5 Author :Running_Time 6 Created Time :2015-8-4 19:36:36 7 File Name :HDOJ_2612.cpp 8 ************************************************

HDU 5186 zhx&#39;s submissions 模拟,细节 难度:1

http://acm.hdu.edu.cn/showproblem.php?pid=5186 题意是分别对每一位做b进制加法,但是不要进位 模拟,注意:1 去掉前置0 2 当结果为0时输出0,而不是全部去掉 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=101; const int maxm=201; int n,b; char

Problem N HDU 2612 Find a way (两次BFS求最值)

N - Find a way Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 2612 Description Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Ningbo one year, yifenfei hav

hdu 4738 无向图缩点断桥 // 细节坑题

Caocao's Bridges 题意:给个无向图,求出边权最小的桥. 一看,直接缩点,若无桥,输出-1,有桥,遍历下边,更新最小..分分钟搞定,以为IA的..一交wa... 坑点:1:若原图不连通,则无须派人去!输出0!: 2:若桥的权是0,则还有派一个人把炸弹拿去,输出1! 3:有重边.(按多条边算). 哎!记住这个教训!以后做题 1:考虑边界或者特殊数据!(边权为0!n==1等) 2:考虑原图连通性!(这次考虑了原图就强连通..没有考虑根本不连通!) 3:重边.这题的重边是按重边算(不是一

HDU 1253 胜利大逃亡 NYOJ 523【BFS】

胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 24608    Accepted Submission(s): 9427 Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的

HDU 4771 Stealing Harry Potter&#39;s Precious dfs+bfs

Stealing Harry Potter's Precious Problem Description Harry Potter has some precious. For example, his invisible robe, his wand and his owl. When Hogwarts school is in holiday, Harry Potter has to go back to uncle Vernon's home. But he can't bring his

【HDU 4771 Stealing Harry Potter&#39;s Precious】BFS+状压

2013杭州区域赛现场赛二水... 类似“胜利大逃亡”的搜索问题,有若干个宝藏分布在不同位置,问从起点遍历过所有k个宝藏的最短时间. 思路就是,从起点出发,搜索到最近的一个宝藏,然后以这个位置为起点,搜索下一个最近的宝藏,直至找到全部k个宝藏.有点贪心的感觉. 由于求最短时间,BFS更快捷,但耗内存,这道题就卡在这里了... 这里记录了我几次剪枝的历史...题目要求内存上限32768KB,就差最后600KB了...但我从理论上觉得已经不能再剪了,留下的结点都是盲目式搜索必然要访问的结点. 在此贴

HDU 5024 Wang Xifeng&#39;s Little Plot (bfs)

Problem Description <Dream of the Red Chamber>(also <The Story of the Stone>) is one of the Four Great Classical Novels of Chinese literature, and it is commonly regarded as the best one. This novel was created in Qing Dynasty, by Cao Xueqin.