1. 程式人生 > >ACM/ICPC 2018亞洲區預選賽北京賽站網絡賽 A.Saving Tang Monk II(優先隊列廣搜)

ACM/ICPC 2018亞洲區預選賽北京賽站網絡賽 A.Saving Tang Monk II(優先隊列廣搜)

clas d+ ace char bool style monk per urn

#include<bits/stdc++.h>
using namespace std;
const int maxN = 123;
const int inf = 1e9 + 7;
char G[maxN][maxN];
int times[maxN][maxN][6];
int n, m, sx, sy, ex, ey, ans;
int dir[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};

struct node {
    int x, y, t, o;
    bool operator < (const node& p) const {
        
return t > p.t; } }; void bfs() { node t = (node) { sx, sy, 0, 0 }; times[sx][sy][0] = 0; priority_queue<node> q; q.push(t); while(!q.empty()) { node u = q.top(); q.pop(); int x = u.x, y = u.y, o = u.o, t = u.t; if(x == ex && y == ey) { ans
= min(ans, t); return; } for(int d = 0; d < 4; d++) { int tx = x + dir[d][0]; int ty = y + dir[d][1]; if(tx < 0 || tx >= n || ty < 0 || ty >= m) //越界 continue; if(G[tx][ty] == #) {
if(o == 0) { continue; } else if(times[tx][ty][o-1] > t + 2) { q.push((node) { tx,ty,t+2,o-1 }); times[tx][ty][o-1] = t + 2; } } else if(G[tx][ty] == P && times[tx][ty][o] > t) { q.push((node) { tx,ty,t,o }); times[tx][ty][o] = t; } else if(G[tx][ty] == B && o < 5 && times[tx][ty][o + 1] > t + 1) { q.push((node) { tx,ty,t+1,o+1 }); times[tx][ty][o + 1] = t + 1; } else if(times[tx][ty][o] > t + 1) { q.push((node) { tx,ty,t+1,o }); times[tx][ty][o] = t + 1; } } } } int main() { while(~scanf("%d %d", &n, &m)) { if(n == 0) break; for(int i = 0; i < maxN; i++) for(int j = 0; j < maxN; j++) for(int k = 0 ; k <= 5; k++) times[i][j][k] = inf; for(int i = 0; i < n; i++) { scanf("%s", G[i]); } for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { if(G[i][j] == S) sx = i, sy = j; if(G[i][j] == T) ex = i, ey = j; } } ans = inf; bfs(); if(ans == inf) { printf("-1\n"); } else { printf("%d\n", ans); } } return 0; }

ACM/ICPC 2018亞洲區預選賽北京賽站網絡賽 A.Saving Tang Monk II(優先隊列廣搜)