zoukankan      html  css  js  c++  java
  • 宽度优先搜索 之 CODE[VS] 1026 逃跑的拉尔夫

    
    

    /*
    读懂题意,bfs即可AC。
    不过注意“超出空间 Memory Limit Exceeded”,需要记录节点的状态,判重。
    bool isUsed[i][j][k] := 是否之前已在第k步走到(i, j)的节点,是则true,否则false // 用于判重
    */

      1 #include <iostream>
      2 #include <cstdlib>
      3 #include <cstdio>
      4 #include <cstddef>
      5 #include <iterator>
      6 #include <algorithm>
      7 #include <string>
      8 #include <locale>
      9 #include <cmath>
     10 #include <vector>
     11 #include <cstring>
     12 #include <map>
     13 #include <queue>
     14 #include <stack>
     15 #include <set>
     16 using namespace std;
     17 const int INF = -0x3f3f3f3f;
     18 const int MaxN = 55;
     19 const int modPrime = 3046721; 
     20 
     21 int step[4][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
     22                 //  北       南      西       东
     23 int R, C;
     24 int N;
     25 struct Node
     26 {
     27     int x;
     28     int y;
     29     int stepCnt;
     30 };
     31 
     32 Node startOff;
     33 char imap[MaxN][MaxN];
     34 string direction[1010];
     35 bool isUsed[MaxN][MaxN][1010];
     36 
     37 int getDirection(string str)
     38 {
     39     if (str == "NORTH") return 0;
     40     if (str == "SOUTH") return 1;
     41     if (str == "WEST") return 2;
     42     if (str == "EAST") return 3;
     43     return -1;
     44 }
     45 
     46 void outPut()
     47 {
     48     for (int i = 0; i < R; ++i)
     49     {
     50         for (int j = 0; j < C; ++j)
     51         {
     52             cout << imap[i][j];
     53         }
     54         cout << endl;
     55     }
     56 }
     57 
     58 void Solve()
     59 {
     60     queue<Node> queNode;
     61     queNode.push(startOff);
     62     while (!queNode.empty())
     63     {
     64         Node node = queNode.front();
     65         queNode.pop();
     66         if (node.stepCnt == (N - 1))
     67         {
     68             imap[node.x][node.y] = '*';
     69             continue;
     70         }
     71         int num = getDirection(direction[node.stepCnt+1]);
     72         int x = node.x + step[num][0];
     73         int y = node.y + step[num][1];
     74         while ((x >= 0) && (x < R) && (y >= 0) && (y < C) && (imap[x][y] != 'X'))
     75         {
     76             Node nodeTmp;
     77             nodeTmp.x = x;
     78             nodeTmp.y = y;
     79             nodeTmp.stepCnt = node.stepCnt + 1;
     80             if (!isUsed[nodeTmp.x][nodeTmp.y][nodeTmp.stepCnt])
     81             {
     82                 queNode.push(nodeTmp);
     83                 isUsed[nodeTmp.x][nodeTmp.y][nodeTmp.stepCnt] = true;
     84             }
     85             x = x + step[num][0];
     86             y = y + step[num][1];
     87         }
     88     }
     89 
     90     outPut();
     91 }
     92 
     93 
     94 int main() 
     95 {
     96 #ifdef HOME
     97     freopen("in", "r", stdin);
     98     //freopen("out", "w", stdout);
     99 #endif
    100 
    101     memset(isUsed, false, sizeof(isUsed));
    102     cin >> R >> C;
    103     bool getGoal = false;
    104     for (int i = 0; i < R; ++i)
    105     {
    106         cin >> imap[i];
    107         if (!getGoal)
    108         {
    109             for (int j = 0; j < C; ++j)
    110             {
    111                 if (imap[i][j] == '*')
    112                 {
    113                     imap[i][j] = '.';
    114                     startOff.x = i;
    115                     startOff.y = j;
    116                     startOff.stepCnt = -1;
    117                     getGoal = true;
    118                     break;
    119                 }
    120             }
    121         }
    122     }
    123     cin >> N;
    124     for (int i = 0; i < N; ++i)
    125     {
    126         cin >> direction[i];
    127     }
    128     Solve();
    129 
    130 
    131 #ifdef HOME
    132     cerr << "Time elapsed: " << clock() / CLOCKS_PER_SEC << " ms" << endl;
    133     _CrtDumpMemoryLeaks();
    134 #endif
    135     return 0;
    136 }
    
    
    
     
  • 相关阅读:
    使用CXF开发Web Service服务
    IT成长中的龟兔赛跑
    IT成长中的龟兔赛跑
    什么是共识算法
    python字节序列
    数据分析必备的统计学(二):假设检验
    以太坊Casper 与 分片
    以太坊君士坦丁堡(Constantinople)升级公告
    以太坊基金会:前路,2018
    以太坊团队·2017年第四季度总结
  • 原文地址:https://www.cnblogs.com/shijianming/p/5008920.html
Copyright © 2011-2022 走看看