岛屿问题求最短路径(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序+线段树+堆+并查集)
首先一般化的将下水道和塌陷看成一个东西.注意到在从源点出发的所有需要使用某条下水道的最短路径中,该下水道只会被使用一次,该下水道第一个被访问的点相同,且只会在第一个访问的点使用该下水道.这个第一个访问 ...
随机推荐
- ThinkPHP3.2.3完整版中对Auth.class.php的使用
一,先创建数据表 1.think_auth_rule,规则表 id:主键, name:规则唯一标识, title:规则中文名称 status 状态:为1正常,为0禁用, condition:规则表达式 ...
- Sql Server - CURSOR (游标)
1.声明游标 DECLARE 游标名 CURSOR SELECT语句(注:此处一定是SELECT语句) 2.打开游标 OPEN 游标名 3.读取 ...
- C# 多线程操作实例
1.多线程操作 一旦打开线程就必须记得关闭 1.第一部分 这是个数字叠加小功能 private void CountTo(int countTo, CancellationToken ct) { ; ...
- SurfaceView和SurfaceHolder的基本用法
仅做记录使用,新手也可以来看看,怎么得到一个surfaceholder. 1.在xml文件中增加一个surfaceView控件. <SurfaceView android:layout_widt ...
- 【EfF】 贪婪加载和延迟加载 (virtual去掉关闭延迟加载)
EntityFramework(EF)贪婪加载和延迟加载的选择和使用 贪婪加载:顾名思议就是把所有要加载的东西一 次性读取 1 using (var context = new MyDbContext ...
- EF 完成指定数据迁移
Update-Database -ConfigurationTypeName Bmw.Services.DealerService.WebApiHost.MigrationsOfDealerDB.De ...
- android android各种应用的许可
android各种应用的许可 在Android的设计中,资源的访问或者网络连接,要得到这些服务都需要声明其访问权限,否则将无法正常工作.在Android中这样的权限有很多种,这里将各类访问权限一一罗列 ...
- Kubernetes 集群部署(3) -- Flannel 集群
1. 下载包 wget https://github.com/coreos/flannel/releases/download/v0.11.0/flannel-v0.11.0-linux-amd64. ...
- Thinkphp5.0 路由
路由定义: 有两种方式: (1).动态注册: eg: Route::rule('hello','index/index/hello','GET'); (2)配置式: eg: return [ 'pat ...
- Python描述符深入理解
Python的描述符乍眼看去简单,但是细节方面如果不注意容易掉坑,总结以下几个坑,以作备忘,先看代码: class D: def __get__(self, inst, owner): if inst ...