题目链接: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