一块矩形土地被分成 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之水管问题相关推荐

  1. 二分图匹配匈牙利算法DFS实现

    1 /*==================================================*\ 2 | 二分图匹配(匈牙利算法DFS 实现) 3 | INIT: g[][]邻接矩阵; ...

  2. (造轮子)C 创建队列和图实现广度优先算法(BFS)和深度优先算法(DFS)(数据结构)

    链表.队列和图实现BFS和DFS算法(C+造轮子+详细代码注释) 1.队列的链式存储结构   队列的链式表示称为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表.头指针指向队头节点,尾指针指向 ...

  3. Prim和Kruskal算法应用----城市水管连接

    Prim和Kruskal算法应用----城市水管连接 问题描述: Description: 现在有n个城镇,编号为1, 2, 3, 4-n.他们之间有m条互通的道路,每条道路有相应的长度,现在基于这些 ...

  4. 深度优先搜索 python_黄哥Python:图深度优先算法(dfs)

    深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法.沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所在边都己被探寻过,搜索将回溯到发现 ...

  5. python 短进程优先算法_黄哥Python:图深度优先算法(dfs)

    深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法.沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所在边都己被探寻过,搜索将回溯到发现 ...

  6. hdu 4358(莫队算法+dfs序列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4358 解题思路:用dfs求出整棵树的dfs序列,这样以u为根节点的子树就转化到相对应的区间上了.由于是 ...

  7. BFS广度优先算法, DFS深度优先算法,Python,队列实现,栈实现

    来源:https://www.bilibili.com/video/BV1Ks411575U/?spm_id_from=333.788.videocard.0 BFS广度优先算法 graph = {& ...

  8. c语言dfs算法,DFS算法源程序

    /* dfs算法 */ #include #include #include #include /* 函数结果状态代码 */ #define   True     1 #define   False ...

  9. 啊哈算法-DFS解救小哈python版

    DFS 啊哈算法-解救小哈 maze_map = [] n,m = map(int,(input()).split()) maze_map = [input().split() for i in ra ...

最新文章

  1. WebMagic实现分布式抓取以及断点抓取
  2. 3.11课·········异常语句与for循环重复
  3. python大数据论坛_干货 | Python+大数据计算平台,PyODPS架构手把手教你搭建
  4. 如何来玩MNIST数据集?
  5. 遇到的一些小的tips
  6. java查看sql视图_SQL视图与MS Access查询
  7. java 封装 继承 堕胎_Java的继承、封装和多态
  8. 单词查找树(信息学奥赛一本通-T1337)
  9. 【实践驱动开发2-001】wifi 在android 下的实现 - AR6000 系列移植详细步骤
  10. python重要性_基于Python的随机森林特征重要性图
  11. 《高翔视觉slam十四讲》学习笔记 第七讲 视觉里程计
  12. python:rs, ws, es = select.select(inputs, [], []) --报错error 10022
  13. nvm简介与常见命令
  14. android iptables清空,android中的iptables错误:iptables-save和iptables-restore无法正常工作...
  15. 人工智能机器学习算法
  16. retroarch游戏模拟器使用
  17. select函数使用细节
  18. linux系统下用python写入数据到excel行数限制解决方案(限制1048576行)
  19. class uesrfun.php,帝国cms教程:列表页面批量添加Tags -电脑资料
  20. 开学季好物怎么选,学生党必备的几款好物分享

热门文章

  1. 2018年第九届蓝桥杯省赛试题及详解(Java本科B组)
  2. Allegro学习笔记——扇出
  3. Adobe Fireworks CS6 安装完提示无法访问Adobe服务器 请检查Internet链接或防火墙设置(错误代码:P206)
  4. 通过短信网关发送Wappush(包括超长Wappush)
  5. HP LoadRunner 11.00使用
  6. 谷歌地图下载_拔剑-浆糊的传说_新浪博客
  7. 盘点大佬高考:马云数学考1分 李彦宏系高考状元
  8. 视频编码标准H.264/AVC
  9. 今年最新的30个Android库,你了解吗?
  10. linux 线程的调度策略