zoukankan      html  css  js  c++  java
  • 第六章部分例题

    uva 816

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <queue>
      5 #include <vector>
      6 #include <sstream>
      7 
      8 using namespace std;
      9 
     10 struct Node
     11 {    
     12     int r,c,dir;
     13     
     14     Node(int rx,int cx,int dirx):r(rx),c(cx),dir(dirx){}
     15     Node(){}
     16 };
     17 
     18 
     19 const int maxn=11;
     20 int has_edge[maxn][maxn][4][3],d[maxn][maxn][4];
     21 Node p[maxn][maxn][4];
     22 
     23 int r0,c0,r1,c1,r2,c2;
     24 char dir0,dir1;
     25 
     26 const char* dirs="NESW";
     27 const char* turns="FLR";
     28 
     29 int dir_id(char dir) { return strchr(dirs,dir)-dirs;}
     30 int turn_id(char turn) { return strchr(turns,turn)-turns;}
     31 
     32 const int dr[]={-1,0,1,0};
     33 const int dc[]={0,1,0,-1};
     34 
     35 Node walk(Node n,int i)
     36 {
     37     int dir=n.dir;
     38 
     39     if(i==1) dir=(dir+3)%4;
     40     if(i==2) dir=(dir+1)%4;
     41 
     42     return Node(n.r+dr[dir],n.c+dc[dir],dir);
     43 }
     44 
     45 void print_ans(Node node)
     46 {
     47     vector<Node> nodes;
     48 
     49     for(;;)
     50     {
     51 
     52         int r=node.r;
     53         int c=node.c;
     54         int dir=node.dir;
     55 
     56         nodes.push_back(node);
     57 
     58         if(d[r][c][dir]==0) break;
     59 
     60         node=p[r][c][dir];
     61 
     62     }
     63 
     64     int cnt=0;
     65     for(int i=nodes.size()-1;i>=0;i--)
     66     {
     67         if(cnt%10==0) printf(" ");
     68         printf(" (%d,%d)",nodes[i].r,nodes[i].c);
     69         if(++cnt %10==0) printf("
    ");
     70     }
     71 
     72     if(nodes.size()%10!=0) printf("
    ");
     73 }
     74 
     75 void bfs()
     76 {    
     77     
     78     Node u=Node(r1,c1,dir_id(dir1));
     79     p[r1][c1][dir_id(dir1)]=Node(r0,c0,dir_id(dir0));
     80     d[r0][c0][dir_id(dir0)]=0;
     81     d[r1][c1][dir_id(dir1)]=1;
     82 
     83     queue<Node> q;
     84 
     85     q.push(u);
     86 
     87     while(!q.empty())
     88     {
     89         Node newn=q.front();
     90         q.pop();
     91 
     92         int r,c,dir;
     93 
     94         r=newn.r;
     95         c=newn.c;
     96         dir=newn.dir;
     97 
     98         if(r==r2 && c==c2) { print_ans(newn); return;}
     99 
    100         for(int i=0;i<3;i++)
    101         {
    102             if(has_edge[r][c][dir][i])
    103             {
    104                 Node nextn=walk(newn,i);
    105 
    106                 if(d[nextn.r][nextn.c][nextn.dir]<0)
    107                 {
    108                     d[nextn.r][nextn.c][nextn.dir]=d[newn.r][newn.c][newn.dir]+1;
    109                     p[nextn.r][nextn.c][nextn.dir]=newn;
    110                     q.push(nextn);
    111                 }
    112             }
    113         }
    114 
    115     }
    116 
    117     printf("NO SOLUTIONS
    ");
    118 }
    119 
    120 int main()
    121 {
    122     string name;
    123 
    124     while(cin>>name && name!="END")
    125     {
    126 
    127         memset(p,0,sizeof(p));
    128         memset(has_edge,0,sizeof(has_edge));
    129         memset(d,-1,sizeof(d));
    130 
    131         cin>>r0>>c0>>dir0;
    132         cin>>r2>>c2;
    133 
    134 /*
    135         cout<<"r0="<<r0<<endl;
    136         cout<<"c0="<<c0<<endl;
    137         cout<<"dir0="<<dir0<<endl;
    138         cout<<"r2="<<r2<<endl;
    139         cout<<"c2="<<c2<<endl;
    140         
    141 */
    142         r1=r0+dr[dir_id(dir0)];
    143         c1=c0+dc[dir_id(dir0)];
    144         dir1=dir0;
    145 
    146 /*
    147         cout<<"r1="<<r1<<endl;
    148         cout<<"c1="<<c1<<endl;
    149 
    150 */
    151 
    152         string line;
    153 
    154         getchar();                            //c2后还有个回车所以要先接受
    155         while(getline(cin,line) && line!="0")
    156         {
    157             //cout<<"line:"<<line<<endl;
    158 
    159             stringstream ss(line);
    160 
    161             int r,c;
    162             ss>>r>>c;
    163 
    164             string str;
    165             while(ss>>str && str[0]!='*')
    166             {
    167 
    168                 //cout<<"str:"<<str<<endl;
    169                 int dir=dir_id(str[0]);
    170 
    171                 for(int i=1;i<str.size();i++)
    172                 {
    173                     int turn=turn_id(str[i]);
    174 
    175                     has_edge[r][c][dir][turn]=1;
    176                 }
    177 
    178             }
    179 
    180             ss.clear();
    181         }
    182 
    183         cout<<name<<endl;
    184         bfs();
    185     }
    186 
    187     return 0;
    188 }
    Yosoro
  • 相关阅读:
    PullToRefresh原理解析,pulltorefresh解析
    instanceof和isInstance(Object obj) 和isAssignableFrom(Class cls)的区别和联系
    instanceof和isInstance(Object obj) 和isAssignableFrom(Class cls)的区别和联系
    ListView / GirdView Adpater的getView方法,首项多次调用
    ListView / GirdView Adpater的getView方法,首项多次调用
    Android中View大小的确定过程
    StrictMode 详解
    StrictMode 详解
    ListView中的Item不能点击的解决方法
    ListView中的Item不能点击的解决方法
  • 原文地址:https://www.cnblogs.com/tclan126/p/7300224.html
Copyright © 2011-2022 走看看