題目鏈接: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#include #include #include #include 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 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 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; }