Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <queue>
- using namespace std;
- const int MAXN = 110;
- const int MAXT = 8;
- int ar[MAXN][MAXN][1 << MAXT][4];
- bool vis[MAXN][MAXN][1 << MAXT][4];
- /*
- struct tmp {
- int x;
- int y;
- int t;
- int d;
- tmp() {};
- tmp(int a,int b,int c,int e) {
- x = a;
- y = b;
- t = c;
- d = e;
- }
- };
- tmp from[MAXN][MAXN][1 << MAXT][4];
- */
- int treasure[MAXN][MAXN];
- int grid[MAXN][MAXN];
- queue<int> xq,yq,tq,dq;
- int X,Y,T;
- void visit(int x, int y, int t, int d, int dist) {
- if (x >= 0 && y >= 0 && x < X && y < Y) {
- if (treasure[x][y]) {
- t |= 1 << (treasure[x][y] - 1);
- }
- if (!vis[x][y][t][d]) {
- vis[x][y][t][d] = true;
- ar[x][y][t][d] = dist;
- xq.push(x);
- yq.push(y);
- tq.push(t);
- dq.push(d);
- // from[x][y][t][d] = tmp(xq.front(),yq.front(),tq.front(),dq.front());
- }
- }
- }
- int mx[4] = {-1,0,1,0},my[4] = {0,1,0,-1};
- int next() {
- int x = xq.front();
- int y = yq.front();
- int t = tq.front();
- int d = dq.front();
- int dist = ar[x][y][t][d];
- //printf("At x=%d,y=%d,t=%d,d=%d,dist=%d\n",x,y,t,d,dist);
- int dir = (grid[x][y] + d) % 4;
- visit(x + mx[dir], y + my[dir], t, (d + 1) % 4, dist + 1);
- visit(x, y, t, (d + 1) % 4, dist + 1);
- xq.pop();
- yq.pop();
- tq.pop();
- dq.pop();
- }
- void reset() {
- for(int x = 0; x < X; ++x) {
- for(int y = 0; y < Y; ++y) {
- for(int t = 0; t < (1 << T); ++t) {
- for(int d = 0; d < 4; ++d) {
- vis[x][y][t][d] = false;
- }
- }
- treasure[x][y] = 0;
- }
- }
- }
- char buf[1234567];
- bool read() {
- scanf("%d %d", &X, &Y);
- return !(X == 0 && Y == 0);
- }
- int conv(char c) {
- switch(c) {
- case 'N': return 0;
- case 'E': return 1;
- case 'S': return 2;
- case 'W': return 3;
- }
- return -1;
- }
- int main() {
- while(read()) {
- reset();
- for(int x = 0; x < X; ++x) {
- scanf("%s",buf);
- for(int y = 0; y < Y; ++y) {
- char c = buf[y];
- grid[x][y] = conv(c);
- }
- }
- scanf("%d", &T);
- for(int i = 0; i < T; ++i) {
- int x, y;
- scanf("%d %d", &x, &y);
- x--;
- y--;
- treasure[x][y] = i + 1;
- }
- visit(0, 0, 0, 0, 0);
- while(xq.size()) {
- next();
- }
- int des = (1 << T) - 1;
- int m = -1;
- int bd = 0;
- for(int d = 0; d < 4; ++d) {
- if (vis[X - 1][Y - 1][des][d]) {
- int k = ar[X - 1][Y - 1][des][d];
- if (m == -1 || k < m) {
- m = k;
- bd = d;
- }
- }
- }
- printf("%d\n", m);
- // tmp t = tmp(X-1,Y-1,des,bd);
- // while(t.x != 0 || t.y != 0 || t.d != 0 || t.t != 0) {
- // printf("x: %d y: %d time: %d\n",t.x,t.y,ar[t.x][t.y][t.t][t.d]);
- // t = from[t.x][t.y][t.t][t.d];
- // }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement