zoukankan      html  css  js  c++  java
  • UVa-816 Abbott's Revenge

      1 #include <bits/stdc++.h>
      2 
      3 using namespace std;
      4 
      5 struct Node
      6 {
      7     int r;
      8     int c;
      9     int dir;
     10     Node(int r0,int c0,int dir0) : r(r0),c(c0),dir(dir0) {}
     11     Node() {}
     12 };
     13 
     14 const char* dirs = "NESW";
     15 const char* turns = "FLR";
     16 int dir_id(char c) {return strchr(dirs,c) - dirs;}
     17 int turn_id(char c) {return strchr(turns,c) - turns;}
     18 
     19 const int dr[] = {-1,0,1,0};
     20 const int dc[] = {0,1,0,-1};
     21 
     22 Node walk(const Node& u,int turn)
     23 {
     24     int dir = u.dir;
     25     if(turn == 1) dir = (dir+3)%4;
     26     if(turn == 2) dir = (dir+1)%4;
     27     return Node(u.r+dr[dir],u.c+dc[dir],dir); 
     28 }
     29 
     30 int has_edge[10][10][5][5];
     31 int d[10][10][5];
     32 
     33 int r1,c1,dir;
     34 int r0,c0;
     35 int r2,c2;
     36 
     37 int maxr = 0,maxc = 0;
     38 
     39 int read()
     40 {
     41     memset(has_edge,0,sizeof(has_edge));
     42     string tmp;
     43     cin >> tmp;
     44     if(tmp == "END")
     45         return 1;
     46     cout << tmp << endl;
     47     char tmp_dir;
     48     cin >> r0 >> c0 >> tmp_dir >> r2 >> c2;
     49     dir = dir_id(tmp_dir);
     50     r1 = r0+dr[dir],c1 = c0+dc[dir];
     51 
     52     tmp.clear();
     53     int r,c;
     54     while(cin >> r && r != 0)
     55     {
     56         cin >> c;
     57         if(r > maxr)    maxr = r;
     58         if(c > maxc)    maxc = c;
     59         while(cin >> tmp)
     60         {
     61             if(tmp.size() == 1)
     62                 break;
     63             if(tmp.size()>=2)
     64                 has_edge[r][c][dir_id(tmp[0])][turn_id(tmp[1])] = 1;
     65             if(tmp.size()>=3)
     66                 has_edge[r][c][dir_id(tmp[0])][turn_id(tmp[2])] = 1;
     67             if(tmp.size()>=4)
     68                 has_edge[r][c][dir_id(tmp[0])][turn_id(tmp[3])] = 1;
     69         }
     70     }
     71     maxr ++;
     72     return 0;
     73 }
     74 
     75 int inside(int r,int c)
     76 {
     77     return r<=maxr && c<=maxc && r >= 1 && c >= 1;
     78 }
     79 
     80 Node p[10][10][5];
     81 
     82 void print_ans(Node u)
     83 {
     84     vector<Node> nodes;
     85     while(1)
     86     {
     87         nodes.push_back(u);
     88         if(d[u.r][u.c][u.dir] == 0) break;
     89         u = p[u.r][u.c][u.dir];
     90     }
     91     nodes.push_back(Node(r0,c0,dir));
     92     
     93     int cnt = 0;
     94     for(int i = nodes.size()-1;i >= 0;i --)
     95     {
     96         if(cnt % 10==0)    printf(" ");
     97         printf(" (%d,%d)",nodes[i].r,nodes[i].c);
     98         if(++cnt % 10==0)    cout << endl;
     99     }
    100     if(nodes.size()%10!=0)    cout << endl;
    101 }
    102 
    103 void solve()
    104 {
    105     queue<Node> q;
    106     memset(d,-1,sizeof(d));
    107     Node u(r1,c1,dir);
    108     d[u.r][u.c][u.dir] = 0;
    109     q.push(u);
    110     while(!q.empty())
    111     {
    112         Node u = q.front();q.pop();
    113         if(u.r == r2 && u.c == c2) {print_ans(u);return ;}
    114         for(int i = 0;i < 3;i ++)
    115         {
    116             Node v = walk(u,i);
    117             if(has_edge[u.r][u.c][u.dir][i] && inside(v.r,v.c)
    118             && d[v.r][v.c][v.dir] < 0)
    119             {
    120                 d[v.r][v.c][v.dir] = d[u.r][u.c][u.dir] + 1;
    121                 p[v.r][v.c][v.dir] = u;
    122                 q.push(v);
    123             }
    124         }
    125     }
    126     printf("  No Solution Possible
    ");
    127 }
    128 
    129 int main()
    130 {
    131     while(1)
    132     {
    133         int st = read();
    134         if(st)
    135             break;
    136         solve();
    137     }
    138     return 0;
    139 }

     核心代码部分参考刘汝佳紫书

  • 相关阅读:
    关于亮剑,文化大革命的一点感想
    iOS -- block
    runtime -- 方法交换的坑自定义方法不执行
    iOS-UITableViewCell
    iOS debug模式
    iOS 将storybord中的视图与viewcontroller相关联
    gitignore的编写规则
    使用cocopods安装Alamofire后各种报错
    ReactNative--坑--'React/RCTBridgeModule.h' file not found
    12-2描点 学完路径可以对整个工具条做个概括 绘图类已完成
  • 原文地址:https://www.cnblogs.com/Asurudo/p/9990853.html
Copyright © 2011-2022 走看看