bfs求最短路径

好久没写搜索,到忘了,找了半个小时错误。

一开始又把题看错了,真服自己了。(认真审题)

这题可以用excel写。but作为一个程序园,那就要使用灵魂操作。

核心算法:bfs层次遍历

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3
  4 string s[35];
  5 int vist[35][55];//标记
  6 int disx[4] = {0, 0, -1, 1};
  7 int disy[4] = {1, -1, 0, 0};
  8 int minn = 2000;
  9 int cnt = 0;
 10 int main(){
 11 	memset(vist, -1, sizeof(vist));
 12 	for(int i = 0; i < 30; ++ i)
 13 		cin >> s[i];
 14 	queue<pair<int, pair<int, int>>> q;
 15 	for(int i = 0; i < 50; ++ i)
 16 		if(s[0][i] != ‘1‘)
 17 			q.push(make_pair(0, make_pair(0, i))), vist[0][i] = 0;
 18
 19 	while(q.size()){
 20
 21 		auto now = q.front();q.pop();
 22 		if(now.first >= minn) break;
 23 		for(int i = 0; i < 4; ++ i){
 24 			int ntx = now.second.first + disx[i];
 25 			int nty = now.second.second + disy[i];
 26
 27 			if(ntx < 0 || ntx >= 30 || nty < 0 || nty >= 50)continue;
 28 			if(s[ntx][nty] == ‘1‘)continue;
 29 			if(vist[ntx][nty] != -1 && vist[ntx][nty] < now.first + 1)continue;
 30 			if(ntx == 29)
 31 			{
 32 				minn = now.first + 1; cnt ++;
 33 				cout << minn << endl;
 34 			}
 35 			q.push(make_pair(now.first + 1, make_pair(ntx, nty)));
 36
 37 			vist[ntx][nty] = now.first + 1;/*1110111
 38 											 1100011
 39 											 1101011
 40 											 1100011
 41 											 1110111*/ //解决这种情况,防止少数
 42 		}
 43 	}
 44 	cout << cnt << endl;
 45 	return 0;
 46 }
 47
 48
 49 

原文地址:https://www.cnblogs.com/rstz/p/12392061.html

时间: 2024-11-09 18:33:25

bfs求最短路径的相关文章

UVa 1599 理想路径(反向BFS 求最短路径 )

题意: 给定一个有重边有自环的无向图,n个点(2 <= n <= 100000), m条边(1 <= m <= 200000), 每条边有一个权值, 求从第一个点到n的最少步数, 如果最少步数相同有多条路径, 那么输出权值字典序最小的一条. 分析: 用BFS解决最短路问题, 可以先从终点BFS, 求出每个点到终点的最短距离. 那么最少步数就是起点的最短距离, 最短路径就是从起点每次向最短距离比自己少1的顶点移动(如果有多个则可以随便走), 这样就可以保证走的是最短路径, 如果一开始

bfs:求最短路径的长度

*/--> pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;}

Catch That Cow BFS求线性双向最短路径

Catch That Cow Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer

POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路)

POJ 2251 题目大意: 给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径,移动方向可以是上,下,左,右,前,后,六个方向,每移动一次就耗费一分钟,要求输出最快的走出时间.不同L层的地图,相同RC坐标处是相连通的.(.可走,#为墙) 解题思路:从起点开始分别往6个方向进行BFS(即入队),并记录步数,直至队为空.若一直找不到,则困住. /* POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路) */ #include <cstdio> #i

UVa 816 (BFS求最短路)

/*816 - Abbott's Revenge ---代码完全参考刘汝佳算法入门经典 ---strchr() 用来查找某字符在字符串中首次出现的位置,其原型为:char * strchr (const char *str, int c) ---BFS求最短路 --*/ #define _CRT_SECURE_NO_DEPRECATE #include<iostream> #include<string.h> #include<queue> #include<al

POJ 2251-Dungeon Master (三维空间求最短路径)

Description You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of unit cubes which may or may not be filled with rock. It takes one minute to move one unit north, south, east, west, up or down. You cannot m

[codeforces-543B]bfs求最短路

题意:给一个边长为1的无向图,求删去最多的边使得从a到b距离<=f,从c到d距离<=g,a,b,c,d,f,g都是给定的,求最多删去的边数. 思路:反过来思考,用最少的边构造两条从a到b,从c到d的路径,使得它们满足题目中的条件.于是可以把这两条路径的相对位置分为两种情况,不相交和相交,对于不相交的情况答案就是两组距离之和,对于相交的情况,两条路径肯定共享一段连续路径,对于共享多段的情况可以把中间没共享的取较小值变成共享,得到的距离和不会更大,因此最优情况一定是一段连续的路径.于是可以枚举共享

hdu1428 记忆化搜索(BFS预处理最短路径和+DP+DFS)

题意:有一块 n * n 大小的方形区域,要从左上角 (1,1)走到右下角(n,n),每个格子都有通过所需的时间,并且每次所走的下一格到终点的最短时间必须比当前格子走到重点的最短时间短,问一共有多少种走法. 这道题还是很明显的 DP 的,而且鉴于走到相邻格点可以上下左右走,所以我很快就锁定了记忆化搜索这种 DP 方式,但是事实上我的思路大方向的确没有错误,但是我仍然没有很好地挖掘题目的信息.我的想法是,某点到结尾的最短距离我可以转化成到起始点的最短距离,这样我就能从开头的点开始遍历,并且在遍历的

数据结构:可以用求最短路径的方法思想求最长路径么?给出详细解答。。

数据结构:可以用求最短路径的方法思想求最长路径么?为什么呢? 这里求解最短路径的通用方法有Dijkstra算法和Floyd-Warshall算法,Dijkstra算法不允许边的权值为负,也不允许有回路,而Floyd-Warshall算法可以允许边的权值为负,但不允许负值边构成回路,即可以求解有回路的图 它们都有局限,这两种算法的思想可以用来求最长路径么?? 为什么 不可以? (感谢给我答案的好心人:来自于知乎:http://www.zhihu.com/question/27201255和CSDN