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;
}