Phillip and Trains 【CodeForces】【為什麼BFS會MLE多次總結教訓】
阿新 • • 發佈:2018-12-13
題目連結
這道題其實不難,但卻給予了我需要總結的東西,因為當你做bfs的時候,我看這道題是往一個方向的所以就沒考慮是否遍歷過這個問題,但是,確實會重複經過同一個節點的。。。QAQ.....
題目是一個換參考系的BFS裸題,就是告訴你有個人,躲火車,每次往前走一步之後可以向上、向下、原地不動,這麼三種狀態,那麼火車既然要相向開過來,不如就相當於人橫向走的是三步即可,然後來過的點就不要再走了!!!中間還有件事,就是你得判斷路上是否有火車,還有就是成功逃亡的時候,可能會超出邊界,所以一開始多開幾個點。
完整程式碼:
#include <iostream> #include <cstdio> #include <cmath> #include <string> #include <cstring> #include <algorithm> #include <limits> #include <vector> #include <stack> #include <queue> #include <set> #include <map> #define lowbit(x) ( x&(-x) ) #define pi 3.141592653589793 #define e 2.718281828459045 using namespace std; typedef long long ll; const int maxN=115; int N, K, sx, sy; char mp[4][maxN]; bool vis[4][maxN]; struct node { int x, y; node(int a=0, int b=0):x(a), y(b) {} }u, v; queue<node> Q; bool bfs(int x, int y) { while(!Q.empty()) Q.pop(); Q.push(node(x, y)); vis[x][y]=true; while(!Q.empty()) { u=Q.front(); Q.pop(); if(u.y>=N) return true; u.y++; if(mp[u.x][u.y]=='.') { for(int i=-1; i<=1; i++) { v=node(u.x+i, u.y); if(v.x<1 || v.x>3) continue; if(mp[v.x][v.y]=='.' && mp[v.x][v.y+1]=='.' && mp[v.x][v.y+2]=='.' && !vis[v.x][v.y+2]) { v.y+=2; vis[v.x][v.y]=true; Q.push(v); } } } } return false; } int main() { int T; scanf("%d", &T); while(T--) { scanf("%d%d", &N, &K); memset(vis, false, sizeof(vis)); for(int i=1; i<=3; i++) { scanf("%s", mp[i]+1); if(mp[i][1]=='s') { sx=i; sy=1; mp[i][1]='.'; } mp[i][N+1]=mp[i][N+2]=mp[i][N+3]='.'; } if(bfs(sx, sy)) printf("YES\n"); else printf("NO\n"); } return 0; }