POJ1915Knight Moves(单向BFS + 双向BFS)
单向bfs就是水题
- #include <iostream>
- #include <cstring>
- #include <cstdio>
- #include <algorithm>
- #include <queue>
- using namespace std;
- const int INF = 0x3f3f3f3f;
- const int Max = + ;
- struct Node
- {
- int x, y;
- };
- int g[Max][Max];
- int vis[Max][Max];
- int n, sx, sy, ex, ey;
- int gx[] = {-, -, -, -, , , , };
- int gy[] = {-, -, , , , , -, -};
- bool in_bound(int x, int y)
- {
- if (x >= && y >= && x < n && y < n)
- return true;
- return false;
- }
- int bfs(int sx, int sy)
- {
- Node node, temp;
- node.x = sx;
- node.y = sy;
- vis[sx][sy] = ;
- queue<Node> q;
- q.push(node);
- while (!q.empty())
- {
- node = q.front();
- q.pop();
- if (node.x == ex && node.y == ey)
- return vis[ex][ey];
- for (int i = ; i < ; i++)
- {
- int fx = node.x + gx[i];
- int fy = node.y + gy[i];
- if (in_bound(fx, fy) && vis[fx][fy] > vis[node.x][node.y] + )
- {
- temp.x = fx;
- temp.y = fy;
- vis[fx][fy] = vis[node.x][node.y] + ;
- q.push(temp);
- }
- }
- }
- return -;
- }
- int main()
- {
- int test;
- scanf("%d", &test);
- while (test--)
- {
- scanf("%d", &n);
- scanf("%d%d%d%d", &sx, &sy, &ex, &ey);
- memset(vis, INF, sizeof(vis));
- printf("%d\n", bfs(sx, sy));
- }
- return ;
- }
单向bfs
做这题主要是学着写双向bfs;
分别从起点和终点开始搜,如果重合即找到
- #include <iostream>
- #include <cstring>
- #include <cstdio>
- #include <algorithm>
- #include <queue>
- using namespace std;
- const int INF = 0x3f3f3f3f;
- const int Max = + ;
- struct Node
- {
- int x, y;
- bool step;
- };
- // 这个step的意思之前没搞明白,他其实就是指的 在某一步下可以走到点
- //开始讲 start.step设为true,因此在只能走一次 8 个点,然后8个点都是第一步走的,然后把最后一个点的step设为true,当你走第二部时候,就是 do { 以这个点扩展 8 步} while ( !current.step) step控制了层数。
- int g[Max][Max];
- int vis[Max][Max];
- int n, sx, sy, ex, ey;
- int gx[] = {-, -, -, -, , , , };
- int gy[] = {-, -, , , , , -, -};
- bool in_bound(int x, int y)
- {
- if (x >= && y >= && x < n && y < n)
- return true;
- return false;
- }
- int bfs()
- {
- if (sx == ex && sy == ey)
- return ;
- Node start, finish;
- start.x = sx;
- start.y = sy;
- start.step = true;
- finish.x = ex;
- finish.y = ey;
- finish.step = true;
- vis[sx][sy] = ;
- vis[ex][ey] = ;
- queue<Node> frontSearch;
- queue<Node> backSearch;
- int fstep = , bstep = ;
- frontSearch.push(start);
- backSearch.push(finish);
- Node current;
- while (!frontSearch.empty() || !backSearch.empty())
- {
- if (!frontSearch.empty())
- {
- do
- {
- current = frontSearch.front();
- frontSearch.pop();
- for (int i = ; i < ; i++)
- {
- int fx = current.x + gx[i];
- int fy = current.y + gy[i];
- if (in_bound(fx, fy))
- {
- if (vis[fx][fy] == )
- {
- return fstep + bstep + ;
- }
- if (!vis[fx][fy])
- {
- vis[fx][fy] = ;
- Node temp;
- temp.x = fx;
- temp.y = fy;
- temp.step = false;
- frontSearch.push(temp);
- }
- }
- }
- }while(current.step == false);
- fstep++;
- current = frontSearch.front();
- frontSearch.pop();
- current.step = true; // 为了让最后队列中最后一个数step为true,先将队首拿出来,修改step,然后在入队
- frontSearch.push(current);
- }
- if (!backSearch.empty())
- {
- do
- {
- current = backSearch.front();
- backSearch.pop();
- for (int i = ; i < ; i++)
- {
- int fx = current.x + gx[i];
- int fy = current.y + gy[i];
- if (in_bound(fx, fy))
- {
- if (vis[fx][fy] == )
- {
- return bstep + fstep + ;
- }
- if (!vis[fx][fy])
- {
- vis[fx][fy] = ;
- Node temp;
- temp.x = fx;
- temp.y = fy;
- temp.step = false;
- backSearch.push(temp);
- }
- }
- }
- } while(current.step == false);
- bstep++;
- current = backSearch.front();
- backSearch.pop();
- current.step = true;
- backSearch.push(current);
- }
- }
- return -;
- }
- int main()
- {
- int test;
- scanf("%d", &test);
- while (test--)
- {
- scanf("%d", &n);
- scanf("%d%d%d%d", &sx, &sy, &ex, &ey);
- memset(vis, , sizeof(vis));
- printf("%d\n", bfs());
- }
- return ;
- }
第二种 双向bfs写法:
- #include <iostream>
- #include <cstring>
- #include <cstdio>
- #include <algorithm>
- #include <queue>
- using namespace std;
- const int INF = 0x3f3f3f3f;
- const int Max = + ;
- struct Node
- {
- int x, y;
- bool step;
- };
- int g[Max][Max];
- int fvis[Max][Max], bvis[Max][Max];
- int n, sx, sy, ex, ey;
- int gx[] = {-, -, -, -, , , , };
- int gy[] = {-, -, , , , , -, -};
- bool in_bound(int x, int y)
- {
- if (x >= && y >= && x < n && y < n)
- return true;
- return false;
- }
- int bfs()
- {
- if (sx == ex && sy == ey)
- return ;
- Node start, finish;
- start.x = sx;
- start.y = sy;
- start.step = true;
- finish.x = ex;
- finish.y = ey;
- finish.step = true;
- fvis[sx][sy] = ;
- bvis[ex][ey] = ;
- queue<Node> frontSearch;
- queue<Node> backSearch;
- int fstep = , bstep = ;
- frontSearch.push(start);
- backSearch.push(finish);
- Node current;
- while (!frontSearch.empty() || !backSearch.empty())
- {
- int frontSize = (int) frontSearch.size();
- while (frontSize--) // 直接将这一个队 全都 拿出来更新,就相当于上一中的step一样,控制搜索的层次
- {
- current = frontSearch.front();
- frontSearch.pop();
- for (int i = ; i < ; i++)
- {
- int fx = current.x + gx[i];
- int fy = current.y + gy[i];
- if (in_bound(fx, fy))
- {
- if (bvis[fx][fy] != -) // 如果 倒着搜 已经搜到了,返回
- return fvis[current.x][current.y] + + bvis[fx][fy];
- if (fvis[fx][fy] == -) //否则正着+1
- {
- Node temp;
- temp.x = fx;
- temp.y = fy;
- fvis[fx][fy] = fvis[current.x][current.y] + ;
- frontSearch.push(temp);
- }
- }
- }
- }
- int backSize = (int) backSearch.size();
- while (backSize--)
- {
- current = backSearch.front();
- backSearch.pop();
- for (int i = ; i < ; i++)
- {
- int fx = current.x + gx[i];
- int fy = current.y + gy[i];
- if (in_bound(fx, fy))
- {
- if (fvis[fx][fy] != -)
- {
- return bvis[current.x][current.y] + + fvis[fx][fy];
- }
- if (bvis[fx][fy] == -)
- {
- Node temp;
- temp.x = fx;
- temp.y = fy;
- bvis[fx][fy] = bvis[current.x][current.y] + ;
- backSearch.push(temp);
- }
- }
- }
- }
- }
- return -;
- }
- int main()
- {
- int test;
- scanf("%d", &test);
- while (test--)
- {
- scanf("%d", &n);
- scanf("%d%d%d%d", &sx, &sy, &ex, &ey);
- memset(fvis, -, sizeof(fvis));
- memset(bvis, -, sizeof(bvis));
- printf("%d\n", bfs());
- }
- return ;
- }
双向bfs 方法二
POJ1915Knight Moves(单向BFS + 双向BFS)的更多相关文章
- UVa 1601 || POJ 3523 The Morning after Halloween (BFS || 双向BFS && 降维 && 状压)
题意 :w*h(w,h≤16)网格上有n(n≤3)个小写字母(代表鬼).要求把它们分别移动到对应的大写字母里.每步可以有多个鬼同时移动(均为往上下左右4个方向之一移动),但每步结束之后任何两个鬼不能占 ...
- POJ 3126 Prime Path 解题报告(BFS & 双向BFS)
题目大意:给定一个4位素数,一个目标4位素数.每次变换一位,保证变换后依然是素数,求变换到目标素数的最小步数. 解题报告:直接用最短路. 枚举1000-10000所有素数,如果素数A交换一位可以得到素 ...
- UVA - 1601 The Morning after Halloween (BFS/双向BFS/A*)
题目链接 挺有意思但是代码巨恶心的一道最短路搜索题. 因为图中的结点太多,应当首先考虑把隐式图转化成显式图,即对地图中可以相互连通的点之间连边,建立一个新图(由于每步不需要每个鬼都移动,所以每个点需要 ...
- POJ1915 BFS&双向BFS
俩月前写的普通BFS #include <cstdio> #include <iostream> #include <cstring> #include <q ...
- bfs(双向bfs加三维数组)
http://acm.hdu.edu.cn/showproblem.php?pid=2612 Find a way Time Limit: 3000/1000 MS (Java/Others) ...
- BFS、双向BFS和A*
BFS.双向BFS和A* Table of Contents 1. BFS 2. 双向BFS 3. A*算法 光说不练是无用的.我们从广为人知的POJ 2243这道题谈起:题目大意:给定一个起点和一个 ...
- 双向BFS和启发式搜索的应用
题目链接 P5507 机关 题意简述 有12个旋钮,每个旋钮开始时处于状态 \(1\) ~ \(4\) ,每次操作可以往规定方向转动一个旋钮 (\(1\Rightarrow2\Rightarrow ...
- 洛谷 P1379 八数码难题(map && 双向bfs)
题目传送门 解题思路: 一道bfs,本题最难的一点就是如何储存已经被访问过的状态,如果直接开一个bool数组,空间肯定会炸,所以我们要用另一个数据结构存,STL大法好,用map来存,直接AC. AC代 ...
- POJ 1915-Knight Moves (单向BFS && 双向BFS 比)
主题链接:Knight Moves 题意:8个方向的 马跳式走法 ,已知起点 和终点,求最短路 研究了一下双向BFS,不是非常难,和普通的BFS一样.双向BFS只是是从 起点和终点同一时候開始搜索,可 ...
随机推荐
- 记、基于react-router的单页应用
现在用react写单页应用基本上都是用react-router做前端路由了吧!最近在使用react-router的过程中遇到了不少问题,在这里总结一下. 浏览器url react-router默认提供 ...
- Crowdsourcing(众包)
群众外包(英语:crowdsourcing)是互联网带来的新的生产组织形式.<连线>(Wired)杂志记者Jeff Howe于2006年发明的一个专业术语,用来描述一种新的商业模式,即企业 ...
- matlab 中randn randi rand randsrc的用法以及区别
1,rand 生成均匀分布的伪随机数.分布在(0~1)之间 主要语法:rand(m,n)生成m行n列的均匀分布的伪随机数 rand(m,n,'double') ...
- 1031MVCC和事务浅析
转自 http://blog.csdn.net/sofia1217/article/details/50778906 关于MVCC浅析,有些难度http://xuebinbin212.blog.163 ...
- SVG的使用
一,svg可以在浏览器中直接打开 二,在html使用<img/>标签引用 三,直接在html中使用svg标签 四,作为css背景 SVG支持ie9+ ,chrome 33.0+,firef ...
- Qt5.3.0 for Android开发环境配置
1.去官网下载Qt5.3.0 for Android 2.去http://developer.android.com下载Ndk 和SDk 3.去http://ant.apache ...
- C/C++中NULL的涵义
参考:百度知道NULL表示空指针,用于表示一个无效的指针,它的值为0(早期C语言的实现中可能有非0空指针,现在已经不用).对指针置NULL即标记指针无效,避免“野指针”的恶果.NULL在C/C++标准 ...
- [转]使用Sencha Ext JS 6打造通用应用程序
原文地址:http://www.uedsc.com/using-sencha-ext-js-6-to-build-universal-apps.html 在Sencha和整个Ext JS团队的支持下, ...
- maven2-snapshot快照库和release发布库的应用
在项目中应用snapshot和release库,应用snapshot和release库达到不同环境下发布不同的版本的目的,首先看一个pom文件的定义: <project> <mode ...
- iis Server Error in '/' Application
1.开始-运行-cmd-输入cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727-回车-aspnet_regiis.exe -i 回车 2.如果不是检查链接 ...