游戏大致规则是:一块矩形土地被分成N*M的单位正方形,现在这块土地已经埋设了一些水管。

水管将从矩形土地的左上角左部边缘,延伸到右下角右部边缘。

水管只有两种:弯管和直管

弯管有四种状态

直管有两种状态

0,1,2,3,4,5,6分别表示:0表示树木,1,2,3,4表示弯管四种状态。5,6表示直管两种状态。

程序需要判断进水口:进水口在左边用1表示;在上边用2表示;在右边用3表示;在下边用4表示。

/*水管工:铺设管道*/#include<stdio.h>int a[51][51];//假设土地大小不超过50*50
int book[51][51];
int n, m, flag = 0;
void dfs(int x, int y, int front)//front:定义四个方向左上右下分别为1234
{
//    int i;//判断是否到达终点,(n,m+1)//另外判断是否到达终点必须放在越界前面判断if (x == n && y == m + 1){flag = 1; //找到铺设方案return;}//判断是否越界if (x<1 || x>n || y<1 || y>m)return;//判断这个管道是否在路径中已经使用过if (book[x][y] == 1)return;book[x][y] = 1;//标记使用当前这个管道//当前管道是直管情况if (a[x][y] >= 5 && a[x][y] <= 6){//直管有四个方向,需要逐个判断if (front == 1) //水从左边进
        {dfs(x, y + 1, 1);//只能使用5号这种摆放方式
        }if (front == 2)//水从上边进
        {dfs(x + 1, y, 2);//6号
        }if (front == 3)//水从右边进
        {dfs(x - 1, y, 3);//5号
        }if (front == 4)//水从下边进
        {dfs(x, y - 1, 4);//6号
        }}//当前水管是弯管的情况if (a[x][y] >= 1 && a[x][y] <= 4){if (front == 1)//水从左边进
        {dfs(x + 1, y, 2); //3号dfs(x - 1, y, 4);//4号
        }if (front == 2)//水从上边进
        {dfs(x, y + 1, 1);//1号dfs(x, y - 1, 3);//4号
        }if (front == 3)//水从右边进
        {dfs(x - 1, y, 4);//1号dfs(x + 1, y, 2);//2号
        }if (front == 4)//水从下边进
        {dfs(x, y + 1, 1);//2号dfs(x, y - 1, 3);//3号
        }}book[x][y] = 0;return;
}int main()
{int i, j, num = 0;scanf_s("%d %d", &n, &m);//读入游戏地图for (i = 1; i <= n; i++)for (j = 1; j <= m; j++)scanf_s("%d", &a[i][j]);//开始搜索,从(1,1)点开始,进水方向是1dfs(1, 1, 1);//判断是否找到铺设方案if (flag == 0)printf("impossible\n");elseprintf("铺设成功\n");getchar(); getchar();return 0;
}

上面代码并没有解决最初的要求“输出路径”。只需在代码中加入一个栈,就可以输出路径。代码如下:

/*水管工:铺设管道,求输出路径*/#include<stdio.h>int a[51][51];//假设土地大小不超过50*50
int book[51][51];
int n, m, flag = 0;//加入一个栈
struct note
{int x;//横坐标int y;//纵坐标
}s[100];
int top = 0;
void dfs(int x, int y, int front)//front:定义四个方向左上右下分别为1234
{int i;//判断是否到达终点,(n,m+1)//另外判断是否到达终点必须放在越界前面判断if (x == n && y == m + 1){flag = 1; //找到铺设方案for (i = 1; i <= top; i++)printf(" (%d,%d) ", s[i].x, s[i].y);printf("\n");return;}//判断是否越界if (x<1 || x>n || y<1 || y>m)return;//判断这个管道是否在路径中已经使用过if (book[x][y] == 1)return;book[x][y] = 1;//标记使用当前这个管道//将当前尝试的坐标入栈top++;s[top].x = x;s[top].y = y;//当前管道是直管情况if (a[x][y] >= 5 && a[x][y] <= 6){//直管有四个方向,需要逐个判断if (front == 1) //水从左边进
        {dfs(x, y + 1, 1);//只能使用5号这种摆放方式
        }if (front == 2)//水从上边进
        {dfs(x + 1, y, 2);//6号
        }if (front == 3)//水从右边进
        {dfs(x - 1, y, 3);//5号
        }if (front == 4)//水从下边进
        {dfs(x, y - 1, 4);//6号
        }}//当前水管是弯管的情况if (a[x][y] >= 1 && a[x][y] <= 4){if (front == 1)//水从左边进
        {dfs(x + 1, y, 2); //3号dfs(x - 1, y, 4);//4号
        }if (front == 2)//水从上边进
        {dfs(x, y + 1, 1);//1号dfs(x, y - 1, 3);//4号
        }if (front == 3)//水从右边进
        {dfs(x - 1, y, 4);//1号dfs(x + 1, y, 2);//2号
        }if (front == 4)//水从下边进
        {dfs(x, y + 1, 1);//2号dfs(x, y - 1, 3);//3号
        }}book[x][y] = 0;//取消标记top--;//将当前尝试的坐标出栈return;
}int main()
{int i, j, num = 0;scanf_s("%d %d", &n, &m);//读入游戏地图for (i = 1; i <= n; i++)for (j = 1; j <= m; j++)scanf_s("%d", &a[i][j]);//开始搜索,从(1,1)点开始,进水方向是1dfs(1, 1, 1);//判断是否找到铺设方案if (flag == 0)printf("impossible\n");elseprintf("管道铺设成功\n");getchar(); getchar();return 0;
}

转载于:https://www.cnblogs.com/lxt1105/p/6437272.html

啊哈算法---水管工游戏相关推荐

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

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

  2. 水管工游戏——dfs

    问题描述: 水管工游戏是指如下图中的矩阵中,一共有两种管道,一个是直的,一个是弯的,所有管道都可以自由旋转,最终就是要连通入水口可出水口.其中的树为障碍物. 方案: 输入格式:输入的第一行为两个整数N ...

  3. 水管工游戏 (深搜)

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

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

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

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

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

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

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

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

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

  8. 2018-2-22 《啊哈,算法》再练习广度优先搜索,题:炸怪兽, 2-23改用深度优先搜索。宝岛探险(广度,深度,及地图着色)2-24水管工游戏,2-25测试水管工代码...

    2小时. 先是是纠错,通过对代码运行过程的测试.发现是变量打错.以及录入地图❌. 重构练习题,改使用while..end代替for in. ⚠️ : 在while(k <= n)中如果用到nex ...

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

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

最新文章

  1. 拼接所有字符串产生字典顺序最小的大写字符串
  2. 程序猿的英语之ielts indicator speaking test
  3. linux开权限变绿了,解读Linux文件权限的设置方法
  4. MongoDB中的分页–如何真正避免性能下降?
  5. python websocket爬虫_Python如何爬取实时变化的WebSocket数据
  6. 在SIP对讲机中RTP/RTCP的实现
  7. request对象_爬虫:request库的简介
  8. 夏普SHARP MX-3508N 一体机驱动
  9. java旅游网站毕业论文_旅游网站的设计与实现
  10. 2021年山东省职业院校技能大赛中职组网络安全赛项竞赛样题
  11. win10计算器_计算器也能刷Win10,国外大神又现惊人操作
  12. CAD梦想画图中的“阵列命令”
  13. iOS iPhone设备判断大全,包含X系列和11
  14. 获取各大电商平台商品详情api(api接口)
  15. 【系统】《写给大忙人看的操作系统》--研读
  16. JAVA猎才优秀博主分享
  17. QGIS 3.10 矢量样式设置
  18. 华为Nova 4 HL1VCEM (VCE-L22/VCE-AL00)手机图纸电路原理图+主板高清图片
  19. 第 2-4 课:表格组件详解(Table 和 Data Tables)
  20. tomcat(不只是tomcat还有其他国产化web中间件)中一些问题

热门文章

  1. hbase/hadoop异常:No lease on /hbase/archive/data/... File is not open for writing
  2. CSS 标签诡异添加 injected stylesheet
  3. python蚂蚁森林自动偷能量_蚂蚁森林自动偷能量 激活 - 『精品软件区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn...
  4. log4j输出多个自定义日志文件、动态配置多个日志文件
  5. java 微信获取用户地理位置_Java微信公众平台开发之获取地理位置
  6. Python学习笔记五:控制语句
  7. Redis - 几款可视化工具
  8. FreeRTOS中的任务堆栈溢出检测机制
  9. java基于springboot畜牧场信息管理系统
  10. 腾讯云账号注册方法介绍