题目链接:点击打开链接
题意:从起点到终点,每秒可以选择前进、向左、向右转, 每前进一格轮子转到下一个颜色, 一共5中颜色, 开始的时候绿色接触地面,朝北, 要求最后也绿色接触地面,求能否到达目标点以及最短时间。
思路:和普通BFS相比,多了两个附加条件,所以要将状态表示全面,也要对应加两维。 水题。
细节参见代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) using namespace std; typedef long long ll; const double PI = acos(-1.0); const double eps = 1e-6; const int mod = 5; const int INF = 1000000000; const int maxn = 50; int t,n,m,d[maxn][maxn][6][4],kase=0; int dir[] = {0,1,2,3}; // 东南西北 int dx[] = {0, 1, 0, -1}; int dy[] = {1, 0, -1, 0}; struct node { int x, y, col, dir; node(int x=0, int y=0, int col=0, int dir=0):x(x),y(y),col(col),dir(dir) {} }S,T; char s[maxn][maxn]; int BFS() { queue<node> q; memset(d, -1, sizeof(d)); d[S.x][S.y][S.col][S.dir] = 0; q.push(S); while(!q.empty()) { node u = q.front(); q.pop(); if(u.x == T.x && u.y == T.y && u.col == 0) return d[u.x][u.y][u.col][u.dir]; node v = u; v.x = v.x + dx[v.dir]; v.y = v.y + dy[v.dir]; v.col = (v.col + 1) % mod; if(v.x >= 1 && v.x <= n && v.y >= 1 && v.y <= m && d[v.x][v.y][v.col][v.dir] == -1 && s[v.x][v.y] != '#') { d[v.x][v.y][v.col][v.dir] = d[u.x][u.y][u.col][u.dir] + 1; q.push(v); } v = u; v.dir = (v.dir - 1 + 4) % 4; if(v.x >= 1 && v.x <= n && v.y >= 1 && v.y <= m && d[v.x][v.y][v.col][v.dir] == -1 && s[v.x][v.y] != '#') { d[v.x][v.y][v.col][v.dir] = d[u.x][u.y][u.col][u.dir] + 1; q.push(v); } v = u; v.dir = (v.dir + 1) % 4; if(v.x >= 1 && v.x <= n && v.y >= 1 && v.y <= m && d[v.x][v.y][v.col][v.dir] == -1 && s[v.x][v.y] != '#') { d[v.x][v.y][v.col][v.dir] = d[u.x][u.y][u.col][u.dir] + 1; q.push(v); } } return -1; } int main() { while(~scanf("%d%d",&n,&m)) { if(n == 0 && m == 0) return 0; if(kase) printf("\n"); for(int i=1;i<=n;i++) { scanf("%s",s[i]+1); } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(s[i][j] == 'S') S = node(i, j, 0, 3); else if(s[i][j] == 'T') T = node(i, j, 0, 0); } } int ans = BFS(); printf("Case #%d\n",++kase); if(ans == -1) printf("destination not reachable\n"); else printf("minimum time = %d sec\n",ans); } return 0; }