816:Abbott's Revenge

Abbott's Revenge

一些細節要特別注意

#include<bits/stdc++.h>
using namespace std;
const int maxn = 10;
const char* dirs = "NESW";
const char* turns = "FLR";
struct Node{
    int r,c,dir;
    Node(int a = -1,int b = -1,int d = -1):r(a),c(b),dir(d) {}
};

int turs[maxn][maxn][4][3];
int d[maxn][maxn][4];
int r0,c0,dir,r1,c1,r,c,mark;
char cc,s[10];
char name[30];Node sta;
Node p[maxn][maxn][4];

int dr[] = {-1,0,1,0};
int dc[] = {0,1,0,-1};

int con_dir(char c){ return strchr(dirs,c) - dirs; }
int con_turn(char c){ return strchr(turns,c) - turns; }

int inside(int r,int c){
    return r > 0 && r <= 9 && c > 0 && c <= 9;
}
Node walk(Node u,int turn){
    int dir = u.dir;
    if(turn == 1) dir = (dir + 3) % 4;
    if(turn == 2) dir = (dir + 1) % 4;
    return Node(u.r + dr[dir],u.c + dc[dir],dir);
}

void Print(Node u){
    stack<Node>S;
    while(1){
        S.push(u);
        if(d[u.r][u.c][u.dir] == 0) break;
        u = p[u.r][u.c][u.dir];
    }
    S.push(Node(r0,c0,0));
    int i = 0;
    while(!S.empty()){
        if(i++%10 == 0) printf("\n ");
        Node t = S.top(); S.pop();
        printf(" (%d,%d)",t.r,t.c);
    }
    putchar('\n');
}

void BFS(){
    queue<Node>q;
    d[sta.r][sta.c][sta.dir] = 0;
    q.push(sta);
    while(!q.empty()){
        Node u = q.front(); q.pop();
        if(u.r == r1 && u.c == c1){ Print(u); return; }
        for(int i = 0;i < 3;i++){
            Node t = walk(u,i);
            if(turs[u.r][u.c][u.dir][i] && inside(t.r,t.c) && d[t.r][t.c][t.dir] < 0){
                d[t.r][t.c][t.dir] = d[u.r][u.c][u.dir] + 1;
                p[t.r][t.c][t.dir] = u;
                q.push(t);
            }
        }
    }
    puts("\n  No Solution Possible");
}

int main(){
    // freopen("data.in","r",stdin);
    // freopen("data.out","w",stdout);
    while(scanf("%s%d%d %c%d%d",name,&r0,&c0,&cc,&r1,&c1) == 6){
        memset(turs,0,sizeof(turs));
        memset(d,-1,sizeof(d));
        dir = con_dir(cc);
        sta = walk(Node(r0,c0,dir),0);
        while(scanf("%d",&r) && r){
            scanf("%d",&c);
            while(scanf("%s",s) == 1 && s[0] != '*'){
                int d = con_dir(s[0]);
                int i = 1;
                while(s[i]) turs[r][c][d][con_turn(s[i++])] = 1;
            }
        }
        printf("%s",name);
        BFS();
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章