算法DFS之水管问题
一块矩形土地被分成 N*M 的单位正方形,现在这块土地已埋设了一些水管,水管想从左上角(1,1)开始,连通到右下角(N,M),水管有两种:
现在可旋转水管,使其连通,例如下图:
记住: 有树木的格子那并没有水管!
如果能通过旋转后连通,就输出铺设路径,不能就输出 impossible
样本输入:
5 4
5 3 5 3
1 5 3 0
2 3 5 1
6 1 1 5
1 5 5 4
样本输出:
(1,1) (1,2) (2,2) (3,2) (3,3) (3,4) (4,4) (5,4)
输入的第一行表示地图大小 N*M
地图中 0 表示树木,1~6表示水管的六种不同摆放方式
完整代码如下
#include <iostream>
using namespace std;int a[51][51];
int book[51][51], n, m, flag=0;
struct note{int x;int y;
}s[100];
int top = 0; // 模拟栈的指针// 进水口front 左 1, 上 2, 右 3, 下 4
void dfs(int x, int y, int front){if (x == n && y == m + 1){flag = 1;for (int i = 1; i <= top; i++)printf("(%d, %d) ", s[i].x, s[i].y);return;}if (x<1 || x>n || y<1 || y>m || book[x][y])return;book[x][y] = 1;// 入栈top++; s[top].x = x;s[top].y = y;if (a[x][y] == 5 || a[x][y] == 6){ // 直管switch (front){case 1: // 进水口在左边的情况dfs(x, y + 1, 1); // 5号方式, 下次进水口 1break;case 3: // 右dfs(x, y - 1, 3); // 5号方式, 下进 3break;case 2: // 上dfs(x + 1, y, 2); // 6号方式, 下进 2break;case 4: // 下dfs(x - 1, y, 4); // 6号方式 下进4break;default:break;}}if (a[x][y] >= 1 && a[x][y] <= 4){switch (front){case 1: // 左dfs(x + 1, y, 2); // 3号方式dfs(x - 1, y, 4); // 4号方式break;case 2: // 上 dfs(x, y + 1, 1); // 1号dfs(x, y - 1, 3); // 4号break;case 3:dfs(x - 1, y, 4); // 1号dfs(x + 1, y, 2); // 2号break;case 4:dfs(x, y + 1, 1); // 2号dfs(x, y - 1, 3); // 3号break;default:break;}}book[x][y] = 0; // 取消标记top--; // 将当前尝试的坐标出栈return;
}int main(){int i, j, num = 0;cin >> n >> m;for (i = 1; i <= n; i++){for (j = 1; j <= m; j++){cin >> a[i][j];}}// 开始搜索,从 1,1 开始,进水方向也是1dfs(1, 1, 1);if (flag == 0){ // 未找到路径cout << "impossible\n";}return 0;
}/*
5 4
5 3 5 3
1 5 3 0
2 3 5 1
6 1 1 5
1 5 5 4
*/
算法DFS之水管问题相关推荐
- 二分图匹配匈牙利算法DFS实现
1 /*==================================================*\ 2 | 二分图匹配(匈牙利算法DFS 实现) 3 | INIT: g[][]邻接矩阵; ...
- (造轮子)C 创建队列和图实现广度优先算法(BFS)和深度优先算法(DFS)(数据结构)
链表.队列和图实现BFS和DFS算法(C+造轮子+详细代码注释) 1.队列的链式存储结构 队列的链式表示称为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表.头指针指向队头节点,尾指针指向 ...
- Prim和Kruskal算法应用----城市水管连接
Prim和Kruskal算法应用----城市水管连接 问题描述: Description: 现在有n个城镇,编号为1, 2, 3, 4-n.他们之间有m条互通的道路,每条道路有相应的长度,现在基于这些 ...
- 深度优先搜索 python_黄哥Python:图深度优先算法(dfs)
深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法.沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所在边都己被探寻过,搜索将回溯到发现 ...
- python 短进程优先算法_黄哥Python:图深度优先算法(dfs)
深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法.沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所在边都己被探寻过,搜索将回溯到发现 ...
- hdu 4358(莫队算法+dfs序列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4358 解题思路:用dfs求出整棵树的dfs序列,这样以u为根节点的子树就转化到相对应的区间上了.由于是 ...
- BFS广度优先算法, DFS深度优先算法,Python,队列实现,栈实现
来源:https://www.bilibili.com/video/BV1Ks411575U/?spm_id_from=333.788.videocard.0 BFS广度优先算法 graph = {& ...
- c语言dfs算法,DFS算法源程序
/* dfs算法 */ #include #include #include #include /* 函数结果状态代码 */ #define True 1 #define False ...
- 啊哈算法-DFS解救小哈python版
DFS 啊哈算法-解救小哈 maze_map = [] n,m = map(int,(input()).split()) maze_map = [input().split() for i in ra ...
最新文章
- WebMagic实现分布式抓取以及断点抓取
- 3.11课·········异常语句与for循环重复
- python大数据论坛_干货 | Python+大数据计算平台,PyODPS架构手把手教你搭建
- 如何来玩MNIST数据集?
- 遇到的一些小的tips
- java查看sql视图_SQL视图与MS Access查询
- java 封装 继承 堕胎_Java的继承、封装和多态
- 单词查找树(信息学奥赛一本通-T1337)
- 【实践驱动开发2-001】wifi 在android 下的实现 - AR6000 系列移植详细步骤
- python重要性_基于Python的随机森林特征重要性图
- 《高翔视觉slam十四讲》学习笔记 第七讲 视觉里程计
- python:rs, ws, es = select.select(inputs, [], []) --报错error 10022
- nvm简介与常见命令
- android iptables清空,android中的iptables错误:iptables-save和iptables-restore无法正常工作...
- 人工智能机器学习算法
- retroarch游戏模拟器使用
- select函数使用细节
- linux系统下用python写入数据到excel行数限制解决方案(限制1048576行)
- class uesrfun.php,帝国cms教程:列表页面批量添加Tags -电脑资料
- 开学季好物怎么选,学生党必备的几款好物分享
热门文章
- 2018年第九届蓝桥杯省赛试题及详解(Java本科B组)
- Allegro学习笔记——扇出
- Adobe Fireworks CS6 安装完提示无法访问Adobe服务器 请检查Internet链接或防火墙设置(错误代码:P206)
- 通过短信网关发送Wappush(包括超长Wappush)
- HP LoadRunner 11.00使用
- 谷歌地图下载_拔剑-浆糊的传说_新浪博客
- 盘点大佬高考:马云数学考1分 李彦宏系高考状元
- 视频编码标准H.264/AVC
- 今年最新的30个Android库,你了解吗?
- linux 线程的调度策略