Uva 816(bfs求最短路)

#include <bits/stdc++.h>
using namespace std;
struct Node{
    int r,c,dir;
    Node(int r=0, int c=0, int dir=0):r(r),c(c),dir(dir) {}
};
int have_edge[10][10][4][3];//当前状态 最后一维为是否可以沿着转弯的方向行走
int d[10][10][4];//表示初始状态到此状态的最短路长度
Node pre[10][10][4];
int r0,c0,r1,c1,rf,cf,init_dir;
const char* dirs = "NESW"; 
const char* turns = "FLR";
int id_dir(char s){ return strchr(dirs,s) - dirs;}//  0123
int id_turn(char s){return strchr(turns,s) - turns;}//0不动 1左 顺时针 2右 逆时针
const int dr[] = {-1, 0, 1, 0}; //dirs为上右下左 dr[]和dc[]分别接受一个方向来判断row and col的变化
const int dc[] = {0, 1, 0, -1};
bool input(){
    char s1[99], s2[99];
    if(scanf("%s%d%d%s%d%d",s1,&r0,&c0,s2,&rf,&cf) != 6) { return false;}
    printf("%s\n", s1);
    init_dir = id_dir(s2[0]);
    r1 = r0 + dr[init_dir];
    c1 = c0 + dc[init_dir];
//    printf("%d %d %d\n", init_dir,r1,c1);
    memset(have_edge,0,sizeof(have_edge));
    for(;;){
        int r,c;
        scanf("%d", &r);
        if(r == 0) break;
        scanf("%d", &c);
        while(scanf("%s", &s2) && s2[0] != '*'){
            int len = strlen(s2);
            for(int i = 1; i < len; i++){
                have_edge[r][c][id_dir(s2[0])][id_turn(s2[i])] = 1;
            }
        }
    }
    return true;
}
Node walk(Node u, int turn){                 //
   int dir = u.dir;
   if(turn == 1) dir = (u.dir+3)%4;
   else if(turn == 2) dir = (u.dir+1) %4;
   return Node(u.r + dr[dir], u.c + dc[dir] , dir);
}
bool inside(int r, int c) {
  return r >= 1 && r <= 9 && c >= 1 && c <= 9;
}
void print_ans(Node u){
    vector<Node> ans;
    for(;;){
        ans.push_back(u);
        if(d[u.r][u.c][u.dir] == 0)
            break;
        u = pre[u.r][u.c][u.dir];           //根据最后一个节点回溯打印解
    }
    ans.push_back(Node(r0,c0,init_dir));

    int cnt = 0;
    for(int i = ans.size() -1; i >= 0; i--){
        if(cnt % 10 == 0) printf(" ");
        printf(" (%d,%d)", ans[i].r, ans[i].c);
        if(++cnt % 10 == 0) printf("\n");
    }
    if(ans.size() % 10 != 0) printf("\n");
}
void solve(){
   queue<Node> q;
   memset(d,-1,sizeof(d));
   d[r1][c1][init_dir] = 0;
   Node u(r1,c1,init_dir);
   q.push(u);
   while(!q.empty()){
        Node u = q.front(); q.pop();
//        printf("$   u %d %d %d\n",u.r, u.c,u.dir);
        if(u.r == rf && u.c == cf){
            print_ans(u);
            return;
        }
        for(int i = 0; i < 3; i++){
             Node v;
            if(have_edge[u.r][u.c][u.dir][i])
               v = walk(u,i);
//            printf("&   v %d %d %d\n",v.r, v.c, v.dir);
            if(inside(v.r,v.c) && d[v.r][v.c][v.dir] < 0){
                d[v.r][v.c][v.dir] = d[u.r][u.c][u.dir] + 1;
                pre[v.r][v.c][v.dir] = u;
                q.push(v);
            }
        }
   }
    printf("  No Solution Possible\n");
}
int main(){
    while(input()){
        solve();
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43413621/article/details/88373166