UVA 10047 - The Monocycle(BFS)

题目链接:点击打开链接

题意:从起点到终点,每秒可以选择前进、向左、向右转, 每前进一格轮子转到下一个颜色, 一共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;
}


你可能感兴趣的:(uva,bfs,ACM-ICPC)