岛屿问题求最短路径(DFS)
用1代表陆地,用0代表陆地,你可以上下左右移动,给出下面这张地图求出最短路径
01011
00001
10100
10101
10000
#include <iostream>
#include <algorithm> using namespace std; int arr[][] = { , , -, , , , , - };
int start_x, start_y, end_x, end_y;
int MIN = , step = ;
int map[][] = {
, , , , ,
, , , , ,
, , , , ,
, , , , ,
, , , ,
}; void DFS(int x, int y, int step) {
if (x == end_x && y == end_y) {//函数结束条件:到达目标点
MIN = min(MIN, step);
return;
}
for (int i = ; i < ; ++i) {
int nx = arr[i][] + x;
int ny = arr[i][] + y;//移动位置
if (nx >= || nx < || ny >= || ny < || map[nx][ny] == ) {//如果移动到边界外或者碰到墙,则重新选择方向走
continue;
}
map[x][y] = ;//标记刚刚呆的地方为1,不需要回去了
DFS(nx, ny, step + );//以新的地方再次搜索
map[nx][ny] = ;//当回退时,说明找到了"终点",将改点设置可行,返回上个节点,找寻从上一个点有没有其他的路到终点
}
} int main()
{
cin >> start_x >> start_y >> end_x >> end_y;//输入起点和终点
DFS(start_x, start_y, );
cout << MIN;
system("PAUSE");
return ;
}
类似的下面这种也仅仅是上面的符号变换。
#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#
“#”代表海洋,“.”代表陆地,S代表起点,G代表终点。
这道的起点和终点坐标需要我们去查找,只要在输入时检测是否为起点或者终点,记录下坐标即可。
#include <iostream>
#include <algorithm>
#include <vector> #define MAX_SIZE 50 using namespace std; vector<vector<char> > map(MAX_SIZE, vector<char>(MAX_SIZE, '.'));
int arr[][]{ , , -, , , , , - };
int MIN = , begin_x, end_x, begin_y, end_y, a, b; void DFS(int x, int y, int step) {
if (x == end_x && y == end_y) {
MIN = min(MIN, step);
return;
} for (int i = ; i < ; i++) {
int nx = x + arr[i][];
int ny = y + arr[i][]; if (nx < || nx >= a || ny < || ny >= b || map[nx][ny] == '#') {
continue;
}
map[nx][ny] = '#';
DFS(nx, ny, step + );
map[nx][ny] = '.';
}
} int main()
{
int m, n;
cin >> m >> n;
a = m, b = n;
for (int i = ; i < m; ++i) {
for (int j = ; j < n; ++j) {
cin >> map[i][j];
if (map[i][j] == 'S') {
begin_x = i, begin_y = j;
}
if (map[i][j] == 'G') {
end_x = i, end_y = j;
}
}
} DFS(begin_x, begin_y, ); cout << MIN; return ;
}
上面的这两种方式,利用递归将所有到达目的地的路线都找了出来,取最小值。
岛屿问题求最短路径(DFS)的更多相关文章
- 杭电1142(最短路径+dfs)
A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- Spfa求最短路径
spfa求最短路径,其思想就是遍历每一个点,将没有入队的点入队,从这个点开始不断修改能够修改的最小路径,直到队空.不过这里一个点可以重复入队. 这个需要有存图的基础--------->前向星存图 ...
- C++迪杰斯特拉算法求最短路径
一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...
- 《算法导论》读书笔记之图论算法—Dijkstra 算法求最短路径
自从打ACM以来也算是用Dijkstra算法来求最短路径了好久,现在就写一篇博客来介绍一下这个算法吧 :) Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的 ...
- 求最短路径算法之SPAF算法。
关于求最短路径: 求最短路径的算法有许多种,除了排序外,恐怕是OI界中解决同一类问题算法最多的了.最熟悉的无疑是Dijkstra(不能求又负权边的图),接着是Bellman-Ford,它们都可以求出由 ...
- Dijkstra算法求最短路径(java)(转)
原文链接:Dijkstra算法求最短路径(java) 任务描述:在一个无向图中,获取起始节点到所有其他节点的最短路径描述 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到 ...
- js迪杰斯特拉算法求最短路径
1.后台生成矩阵 名词解释和下图参考:https://blog.csdn.net/csdnxcn/article/details/80057574 double[,] arr = new double ...
- hdu 2616 暴力使用 dfs求最短路径(剪枝有点依稀)
Kill the monster Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- BZOJ4699 树上的最短路(最短路径+dfs序+线段树+堆+并查集)
首先一般化的将下水道和塌陷看成一个东西.注意到在从源点出发的所有需要使用某条下水道的最短路径中,该下水道只会被使用一次,该下水道第一个被访问的点相同,且只会在第一个访问的点使用该下水道.这个第一个访问 ...
随机推荐
- XE StringGrid应用(G1属性触发G2)
unit UnitMain; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System. ...
- SICP练习1.6的解答
cond和if有着同样的效果,为啥用cond实现的new-if不能用于一些函数? 我自己没想明白,在网上搜集了一下答案,部分解答觉得有道理,整理如下: 解答1: if和cond都是特定的求值顺序, 即 ...
- asp.net mvc 中通过url字符串获取controller和action
在项目中遇到需要通过url字符串获取controller和action的情况,百度了 一下找到了一个可以用的方法 ,在这里分享和记录一下 这个方法是在博客园的博问里看到的 原文地址是http://q. ...
- C#中线程的委托
很多时候写windows程序都需要结合多线程,在C#中用如下得代码来创建并启动一个新的线程. Thread thread = new Thread(new ThreadStart(ThreadProc ...
- indexDB的使用和异步图片blob文件保存
//调整webkit兼容性 var indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || w ...
- 杨辉三角的Python实现
杨辉三角的Python实现 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 Python生成器实现杨辉三角: # python def yanghui_tr ...
- WebStorm安装与快捷键
WebStorm是JetBrains 推出的一款强大的HTML5编辑工具(特别开发JavaScript非常好用),被JavaScript开发者誉为“web前端开发神奇”.“最强悍的JavaScript ...
- Codeforces Round #551 (Div. 2)A. Serval and Bus
A. Serval and Bus time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- kali linux之wireshark/tcpdump
抓包嗅探协议分析,必备技能,抓包引擎(linux---libpcap9 windows-----winpcap10) 解码能力优秀 常见协议包 数据包的分层i协议 arp icmp tcp--三次 ...
- HTML5新增的表单元素有哪些?
表单控:color , calendar , date , datetime, datetime-local, time, mouth , week, email, url , search ...