• 问题描述:

水管工游戏是指如下图中的矩阵中,一共有两种管道,一个是直的,一个是弯的,所有管道都可以自由旋转,最终就是要连通入水口可出水口。其中的树为障碍物。

方案:

输入格式:输入的第一行为两个整数N和 M(都不超过10),接下来的N行,每行有M个整数,表示地图中的每一小格。其中0表示树木,1~6分别表示管道的六种不同的摆放方式

输入:

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)

  • 算法思路:

本题使用的是深度优先搜索算法,先标识入水口方向,在每次探索新管道的时候上根据入水口方向进行扩展,然后根据管道的类型来判断下一个节点的入水口方向。水管入口:1代表左,2代表右,3代表上,4代表下。

  • 代码:

#include<cstdio>
#include<iostream>
#define INF 10000000
using namespace std;
int n,m,flag=0;
int a[10][10],b[10][10];
int next[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
struct node
{int x,y;
}s[100];
int top=0;
void dfs(int x,int y,int r)
{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||y<1||x>n||y>m)return ;if(b[x][y]==1)//如果这个点已在路径中return ;b[x][y]=1;//标记top++;s[top].x=x;s[top].y=y;//直水管的情况if(a[x][y]==5||a[x][y]==6){if(r==1)//入口在左
        {dfs(x,y+1,1);}else if(r==2)//入口在右
        {dfs(x,y-1,2);}else if(r==3)//入口在上
        {dfs(x+1,y,3);}else//入口在下
        {dfs(x-1,y,4);}}//弯水管的情况if(a[x][y]>=1&&a[x][y]<=4){if(r==1){dfs(x+1,y,3);dfs(x-1,y,4);}else if(r==2){dfs(x-1,y,4);dfs(x+1,y,3);}else if(r==3){dfs(x,y+1,1);dfs(x,y-1,2);}else{dfs(x,y+1,1);dfs(x,y-1,2);}}b[x][y]=0;//尝试过不能用的点要取消标记并且出栈top--;return ;
}int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){scanf("%d",&a[i][j]);}}dfs(1,1,1);if(flag==0)printf("impossible");printf("\n");return 0;
}

转载于:https://www.cnblogs.com/boboyuzz/p/10428089.html

水管工游戏——dfs相关推荐

  1. tianchai 12023 水管工游戏(DFS搜索)

    题目描述(ID:12023) 标题: 水管工游戏 详情: 这小节有点难,看不太懂可以跳过哦. 最近小哼又迷上一个叫做水管工的游戏.游戏的大致规则是这样的.一块矩形土地被分为N*M的单位正方形,现在这块 ...

  2. 水管工游戏 (深搜)

    水管工游戏 本题依然是采用搜索,深搜,广搜都可以,本代码采用深搜,此题在搜索时需要增加一些判断条件以及下一步要搜索的位置即可. 代码如下: #include<stdio.h> int a[ ...

  3. 啊哈算法之水管工游戏

    先给不同状态的水管编给号吧 跟走迷宫一样的,深搜,每个dfs里遍历水管的状态,如果当前状态和水管指向的下一个状态能连通就深搜过去直到走到终点为止 上代码吧,这个代码是加强版,支持了更多的水管的编号,以 ...

  4. 深度搜索--水管工游戏

    package com.xjj.Ah;import java.util.LinkedList;/*----深度搜索--水管工游戏----* 1. remove(),removeFirst():先移除在 ...

  5. 水管工游戏(随机地图版)

    /*水管工游戏 一块快矩形的土地 被分成N*M的单位正方形 现在这个土地上已经买有一些水管   水管将从(1,1)的左上方 延伸到(N,M)d的矩形下方的右下角右部边缘 水管只有两种     &quo ...

  6. android自定义水管流动,Android水管工游戏的简单脚本

    Unity3d脚本Android水管工游戏的简单脚本 using UnityEngine; using System.Collections; public class TestGoto : Mono ...

  7. 水管工游戏:dfs(递归)

    添柴网这题好想不能评测,所以不确保代码的正确性 题目描述: 这小节有点难,看不太懂可以跳过哦. 最近小哼又迷上一个叫做水管工的游戏.游戏的大致规则是这样的.一块矩形土地被分为N * M的单位正方形,现 ...

  8. 啊哈算法---水管工游戏

    游戏大致规则是:一块矩形土地被分成N*M的单位正方形,现在这块土地已经埋设了一些水管. 水管将从矩形土地的左上角左部边缘,延伸到右下角右部边缘. 水管只有两种:弯管和直管 弯管有四种状态 直管有两种状 ...

  9. 杂谈:编程解决水管工游戏

    杂谈:编程解决水管工问题 程序设计是一门极难上手的技能,仅仅凭着课堂上的知识,只能是熟悉一门编程语言的语法.但要是用计算机来解决一些实际的问题,哪怕是智力问题,课本上的知识是远远不够的. 编程就像学游 ...

最新文章

  1. 【Java 虚拟机原理】Class 字节码二进制文件分析 五 ( 方法计数器 | 方法表 | 访问标志 | 方法名称索引 | 方法返回值类型 | 方法属性数量 | 方法属性表 )
  2. devc++调试下一步没反应_某化工厂污水处理站SBR工艺调试方案
  3. 计算机英语教程第6版司爱侠,计算机专业英语教程(第3版)宋德福 司爱侠 练习参考答案...
  4. gsm,gprs,cmwap,cmnet,3g,TD-SCDMA,CDMA2000,WCDMA
  5. P2698-花盆Flowerpot【单调队列】
  6. python入门必备知识_python入门基本知识
  7. Elasticsearch合并高亮字段
  8. 三招快速搞定 Linux 文件批量重命名!
  9. promise原理—一步一步实现一个promise
  10. c++ PP第十一章最后一题
  11. 新华三计算机网络题,计算机等考试三网络技术模拟试题及答案(二)云南新华电脑学校.doc...
  12. 百度网盘高速直链提取
  13. java做 binggo,CONTRIBUTING.md
  14. 轻松编写您自己的拖拉机算法,进行算法大战
  15. ftp 连接失败。500 OOPS: cannot change directory:
  16. 启动tomcat报错:Could not load the Tomcat server configuration at \Servers\Tomcat v7.0 Server at localhos
  17. 项目名前有个红色感叹号的解决办法
  18. 记录:Ubuntu20.04中安装和设置VScode
  19. 2021朋友圈都在传的10本书,找到了
  20. 连锁不平衡的计算以及LDSC分析多基因遗传

热门文章

  1. catagory,action,data隐式启动匹配规则
  2. 【Unity2D】Sprite 或图片格式常用设置
  3. 【Python】爬虫入门级实战讲解:爬取商城的商品名称及价格
  4. Absible#Ansible-Playbook的任务控制
  5. acm题库c语言,C语言acm竞赛习题集锦.doc
  6. Type mismatch: inferred type is MainActivity but FlutterEngine was expected
  7. 笔记本升级--固态硬盘安装双系统win10-CentOS
  8. yolov5-4.0转caffe记录
  9. signature=5a522a8356f9906b0b775bdada02a4c6,合肥2016年4月29日至2016年5月12日交通违章查询...
  10. 爱签电子合同电子签章助力银行数智化发展