UVa 10047 - The Monocycle (多狀態BFS)
阿新 • • 發佈:2021-07-17
題目連結:https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=0&problem=988&mosmsg=Submission+received+with+ID+26578514
\(d[x][y][dir][c\) 記錄位置,朝向,顏色,\(BFS\) 求解即可
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 55; const int INF = 0x3f3f3f3f; int n, m; char ch[maxn]; int dx[4] = {-1, 0, 1, 0}; int dy[4] = {0, 1, 0, -1}; int sx, sy, tx, ty; int a[maxn][maxn]; int d[maxn][maxn][10][10]; int vis[maxn][maxn][10][10]; int tc[10] = {1, 2, 3, 4, 0}; int td[2][10] = {{1, 2, 3, 0}, {3, 0, 1, 2}}; // 0 N 1 E 2 S 3 W struct Node{ int x, y, d, c; Node(int x, int y, int d, int c): x(x), y(y), d(d), c(c) {}; }; int bfs(){ memset(vis, 0, sizeof(vis)); memset(d, 0x3f, sizeof(d)); queue<Node> q; d[sx][sy][0][0] = 0; q.push(Node(sx, sy, 0, 0)); while(!q.empty()){ Node p = q.front(); q.pop(); if(vis[p.x][p.y][p.d][p.c]) continue; vis[p.x][p.y][p.d][p.c] = 1; if(p.x == tx && p.y == ty && p.c == 0){ return d[p.x][p.y][p.d][p.c]; } // int x = p.x + dx[p.d], y = p.y + dy[p.d], c = tc[p.c]; // 移動 int x = p.x + dx[p.d], y = p.y + dy[p.d], c = tc[p.c]; if(x >= 1 && x <= n && y >= 1 && y <= m && !a[x][y] && !vis[x][y][p.d][c]){ d[x][y][p.d][c] = d[p.x][p.y][p.d][p.c] + 1; q.push(Node(x, y, p.d, c)); } for(int i = 0 ; i < 2 ; ++i){ // 轉向 int dir = td[i][p.d]; if(!vis[p.x][p.y][dir][p.c]){ d[p.x][p.y][dir][p.c] = d[p.x][p.y][p.d][p.c] + 1; q.push(Node(p.x, p.y, dir, p.c)); } } } return INF; } ll read(){ ll s = 0, f = 1; char ch = getchar(); while(ch < '0' || ch > '9'){ if(ch == '-') f = -1; ch = getchar(); } while(ch >= '0' && ch <= '9'){ s = s * 10 + ch - '0'; ch = getchar(); } return s * f; } int main(){ int flag = 0; int kase = 0; while(scanf("%d%d", &n, &m) && (n || m)){ if(flag) printf("\n"); flag = 1; for(int i = 1 ; i <= n ; ++i){ scanf("%s", ch + 1); for(int j = 1 ; j <= m ; ++j){ if(ch[j] == '#') a[i][j] = 1; else if(ch[j] == '.'){ a[i][j] = 0; } else if(ch[j] == 'S'){ sx = i, sy = j; a[i][j] = 0; } else{ tx = i, ty = j; a[i][j] = 0; } } } int ans = bfs(); printf("Case #%d\n", ++kase); if(ans != INF) printf("minimum time = %d sec\n", ans); else { printf("destination not reachable\n"); } } return 0; }