CodeChef submission 19878 (C++ 4.0.0-8) plaintext list. Status: AC, problem B1, contest APRIL09. By srinivas (srinivas), 2009-04-12 16:30:05.
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <map> #include <queue> #include <set> #include <stack> #include <vector> using namespace std; #define For(i,a,b) for (i=a; i != b; ++i) #define Rep(i,n) For(i,0,n) #define set(a,c) memset(a,c,sizeof(a)) #define GI ({int t;scanf("%d",&t);t;}) typedef pair<int,int> ii; priority_queue<ii> Q; char S[1001][1001]; bool reach[1001][1001]; int dist[1001][1001]; int ans[1001][1001]; int st, dst; int main() { int m = GI, n = GI; int i, j; queue<int> Qu; Rep(i,m) Rep(j,n) { if (S[i][j] == '$') dst = i*n + j; else if (S[i][j] == '@') st = i*n + j; else if (S[i][j] == 'D') { Qu.push(i*n+j); reach[i][j] = 1; dist[i][j] = 0; } } while (!Qu.empty()) { int cur = Qu.front(); Qu.pop(); int u = cur / n; int v = cur % n; if (u > 0 && !reach[u-1][v]) { reach[u-1][v] = 1; dist[u-1][v] = dist[u][v] + 1; Qu.push((u-1)*n+v); } if (v > 0 && !reach[u][v-1]) { reach[u][v-1] = 1; dist[u][v-1] = dist[u][v] + 1; Qu.push(u*n + v - 1); } if (u < m-1 && !reach[u+1][v]) { reach[u+1][v] = 1; dist[u+1][v]= dist[u][v] + 1; Qu.push((u+1)*n + v); } if (v < n-1 && !reach[u][v+1]) { reach[u][v+1] = 1; dist[u][v+1]= dist[u][v] + 1; Qu.push(u*n + v + 1); } } Q.push(ii(dist[st/n][st%n],st)); ans[st/n][st%n] = dist[st/n][st%n]; Rep(i,m*n) { if (i == st) continue; ans[i/n][i%n] = -1; } set(reach,0); while (!Q.empty()) { ii top = Q.top(); int d = top.first; Q.pop(); int u = top.second / n; int v = top.second % n; if (u*n+v == dst) break; if (reach[u][v]) continue; reach[u][v] = 1; if (u > 0) { if (ans[u-1][v] < min(d,dist[u-1][v])) { ans[u-1][v] = min(d,dist[u-1][v]); Q.push(ii(ans[u-1][v],(u-1)*n+v)); } } if (v > 0) { if (ans[u][v-1] < min(d,dist[u][v-1])) { ans[u][v-1] = min(d,dist[u][v-1]); Q.push(ii(ans[u][v-1],(u)*n+v-1)); } } if (u < m-1) { if (ans[u+1][v] < min(d,dist[u+1][v])) { ans[u+1][v] = min(d,dist[u+1][v]); Q.push(ii(ans[u+1][v],(u+1)*n+v)); } } if (v < n-1) { if (ans[u][v+1] < min(d,dist[u][v+1])) { ans[u][v+1] = min(d,dist[u][v+1]); Q.push(ii(ans[u][v+1],(u)*n+v+1)); } } } }
Comments

