zoukankan      html  css  js  c++  java
  • hdu 1885【Key Task】

    广搜

    要记录方格里面不同状态时行走的步数

    注意当当前行走的步数大于记录的步数时要剪枝(当然,在记录方格不同状态时的值不为-1时)

    代码如下:
      1 #include <iostream>
      2 #include <cstring>
      3 #include <queue>
      4 using namespace std;
      5 
      6 struct node
      7 {
      8     int x,y;
      9     int step;
     10     int state;
     11 };
     12 char map[105][105];
     13 int R,C;
     14 int sx,sy;
     15 int used[105][105][20];
     16 //记录方向
     17 int dirx[4] = {-1,0,1,0};
     18 int diry[4] = {0,-1,0,1};
     19 //记录颜色
     20 char colorB[4] = {'B','Y','R','G'};
     21 char colorS[4] = {'b','y','r','g'};
     22 
     23 int bfs()
     24 {
     25     memset(used,-1,sizeof(used));//习惯用-1表示该处未用过
     26     node Start;
     27     Start.x = sx;
     28     Start.y = sy;
     29     Start.state = Start.step = 0;
     30     queue<node> q;
     31     q.push(Start);
     32     while(!q.empty())
     33     {
     34         node temp = q.front();
     35         q.pop();
     36 
     37         if(map[temp.x][temp.y] == 'X')
     38             return temp.step;
     39 
     40         for(int i = 0;i < 4;i ++)
     41         {
     42             int rx = temp.x + dirx[i];
     43             int ry = temp.y + diry[i];
     44 
     45             if(rx < 0 || rx >= R || ry < 0 || ry >= C || map[rx][ry] == '#')
     46                 continue;
     47 
     48             node tmp;
     49             tmp.x = rx;
     50             tmp.y = ry;
     51             tmp.state = temp.state;//状态
     52             tmp.step = temp.step + 1;
     53             
     54             if(used[rx][ry][tmp.state] != -1 && tmp.step >= used[rx][ry][tmp.state])//注意
     55                 continue;
     56 
     57             used[rx][ry][tmp.state] = tmp.step;
     58 
     59             int f1 = 1;
     60             for(int j = 0;j < 4;j ++)
     61             {
     62                 if(colorB[j] == map[rx][ry])
     63                 {
     64                     if(tmp.state & (1 << j))
     65                         q.push(tmp);
     66 
     67                     f1 = 0;
     68                     break;
     69                 }
     70             }
     71 
     72             int f2 = 1;
     73             for(int j = 0;f1 && j < 4;j ++)
     74             {
     75                 if(colorS[j] == map[rx][ry])
     76                 {
     77                     if((tmp.state & (1 << j)) == 0)
     78                     {
     79                         tmp.state += (1 << j);
     80                     }
     81                     q.push(tmp);
     82                     f2 = 0;
     83                     break;
     84                 }
     85             }
     86             if(f1 && f2)//当既不是钥匙也不是门时
     87             {
     88                 q.push(tmp);
     89             }
     90         }
     91     }
     92 
     93     return -1;
     94 }
     95 
     96 int main()
     97 {
     98     while(cin >> R >> C,R||C)
     99     {
    100         for(int i = 0;i < R;i ++)
    101         {
    102             for(int j = 0;j < C;j ++)
    103             {
    104                 cin >> map[i][j];
    105                 if(map[i][j] == '*')
    106                 {
    107                     sx = i;
    108                     sy = j;
    109                 }
    110             }
    111         }
    112 
    113         int ans = bfs();
    114         if(ans == -1)
    115         {
    116             cout << "The poor student is trapped!" << endl;
    117         }
    118         else
    119         {
    120             cout << "Escape possible in " << ans << " steps." << endl;
    121         }
    122     }
    123 
    124     return 0;
    125 }
  • 相关阅读:
    学习ActiveMQ(五):activemq的五种消息类型和三种监听器类型
    学习ActiveMQ(三):发布/订阅模式(topic)演示
    学习ActiveMQ(二):点对点(队列)模式消息演示
    Linux系统基础优化及常用命令
    【原创】Access自动编号的初始值设置及重置编号
    【整理】引用类型与ref传递实例精解
    【原创】数据库操作类库整理
    【摘录】Random快速产生相同随机数的原因及解决方案
    【整理】辗转相除法求最大公约数算法证明
    【转载】access采用sql语句与msql的区别
  • 原文地址:https://www.cnblogs.com/Shirlies/p/2623514.html
Copyright © 2011-2022 走看看