宽度优先搜索 之 CODE[VS] 1026 逃跑的拉尔夫

/*
读懂题意,bfs即可AC。
不过注意“超出空间 Memory Limit Exceeded”,需要记录节点的状态,判重。
bool isUsed[MaxN][MaxN][1010]; // 用于判重
*/
  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 }

 
时间: 2024-10-10 00:59:38

宽度优先搜索 之 CODE[VS] 1026 逃跑的拉尔夫的相关文章

宽度优先搜索 之 CODE[VS] 1004 四子连棋

/* bfs + hash判重 第一次接触“hash判重”(哈希函数是依据于取余),是一种很好的思想,不过也有小的瑕疵: hash判重: 棋盘表示:空(0),白(1),黑(2) 整个棋盘一共16个格子,可以看成3进制的16位数,将其转化为10进制数,找一个质数取余,利用余数的不同来给棋盘的状态判重. (用质数取余的原因:我不知道为什么用质数取余,但是<算法导论>以及其他地方都推荐用质数取余,应该不会错的...) 细心一下就会发现,这里面有问题: 定义用于取余的质数为y,需要取余的数集为x[],

宽度优先搜索(BFS)

宽度优先搜索,又称为广度优先搜索,简称BFS 搜索过程:从初始结点开始,逐层向下扩展,即第n层搜索未完成,不得进入下一层搜索 一.初始结点入队,进入循环 二.取出队列的第一个元素 三.判断该结点是不是目标结点,如果是目标结点,则问题解决,跳出循环 四.如果该结点不是目标结点,判断其是否能够扩展,若不能,跳到步骤二 五.如果该结点能扩展,将其子结点放入队列的尾部 六.跳到步骤二 用一个经典的例子(走迷宫)来感受下 给定一个二维数组 int a[10][10] = {0 , 1 , 0 , 0 ,

WIKIOI 1026 逃跑的拉尔夫 深度优先搜索

/* 1026 逃跑的拉尔夫 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子移动路线的装置. 那个装置太旧了,以至于只能发射关于那辆车的移动路线的方向信息. 编写程序,通过使用一张小镇的地图帮助警察局找到那辆车.程序必须能表示出该车最终所有可能的位置. 小镇的地图是矩形的,上面的符号用来标明哪儿可以行车哪儿不行.“.”表示小镇

算法7-4:宽度优先搜索

宽度优先搜索的基本思想就是先将源点添加到一个队列中, 每次从队列中取出一个顶点,将该顶点的邻居顶点中没有拜访过的顶点都添加到队列中,最后直到队列消耗完毕为止. 应用 宽度优先搜索可以解决最短路径问题.而最短路径算法在互联网中应用非常广泛,尤其是路由这块.因为路由追求的是高效,所以每个路由路径都是通过最短路径计算出来的.如果没有最短路径算法,我们可能就享受不到这么快的网速了. 另外,宽度优先搜索在快递行业也会用到,用于计算最短路径. 代码 import java.util.Stack; /** *

宽度优先搜索

Breadth First Search 宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型.Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想.其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果.换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止. 与树的层序遍历一样 遍历结果为 1 2 3 4 5 6 .....21 22 操作: 根节点入队: wh

(总结)宽度优先搜索(Breadth First Search)

ACM入门最经典的开局一般都是宽搜. 宽度优先搜索(以下均简称bfs)一般用于树和图的搜索,在ACM中属于比较基础的技巧,因此需要非常熟练的掌握. 那么从最基础的bfs开始讲起.在一个迷宫中,有一个起点和一个终点(出口),和一些障碍物(无法通过). 比如下图

挑战程序2.1.5 穷竭搜索&gt;&gt;宽度优先搜索(练POJ3669)

先对比一下DFS和BFS         深度优先搜索DFS                                   宽度优先搜索BFS 明显可以看出搜索顺序不同. DFS是搜索单条路径到底部,再回溯. BFS是搜索近的状态,直到底部,一般在求解最短路径或者最短步数上应用. BFS要用到队列呢.. 队列的用法看一看http://blog.csdn.net/cindywry/article/details/51919282 练习题系列--------------------- 题目:p

层层递进——宽度优先搜索(BFS)

问题引入 我们接着上次“解救小哈”的问题继续探索,不过这次是用宽度优先搜索(BFS). 注:问题来源可以点击这里 http://www.cnblogs.com/OctoptusLian/p/7429645.html 最开始小哼在入口(1,1)处,一步之内可以到达的点有(1,2)和(2,1). 但是小哈并不在这两个点上,那小哼只能通过(1,2)和(2,1)这两点继续往下走. 比如现在小哼走到了(1,2)这个点,之后他又能够到达哪些新的点呢?有(2,2).再看看通过(2,1)又可以到达哪些点呢?可以

广度/宽度优先搜索(BFS)详解

广度/宽度优先搜索(BFS) [算法入门] 1.前言 广度优先搜索(也称宽度优先搜索,缩写BFS,以下采用广度来描述)是连通图的一种遍历策略.因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较广的区域,故得名. 一般可以用它做什么呢?一个 广度/宽度优先搜索(BFS) 算法导论里边会给出不少严格的证明,我想尽量写得通俗一点,因此采用一些直观的讲法来伪装成证明,关键的point能够帮你get到就好. 2.图的概念 刚刚说的广度优先搜索是连通图的一种遍历策略,那就有必要将图先简单解释一下.