游戏大致规则是:一块矩形土地被分成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. 12.dateformat常用格式
  2. java-信息安全(一)-BASE64,MD5,SHA,HMAC,RIPEMD算法
  3. SAP CRM Fiori应用My Lead的常见问题和解答
  4. 安阳职业技术学院计算机录取分数线,安阳职业技术学院录取分数线2021是多少分(附历年录取分数线)...
  5. go读取excel_Golang操作Excel
  6. java的URLConnection
  7. linux 强行安装软件,Linux下强制不检测依赖安装VNC
  8. php_connect_nonb,net2ftp无法显示文件列表输出为空
  9. 排序算法专题-希尔排序
  10. 广数系统加工中心编程_加工中心宏程序编程应用案例分享
  11. Asterisk-Javanbsp;教程(中文版)…
  12. vue下载sass依赖
  13. SpringBoot整合Shiro学习(上)
  14. 随机森林分析共享单车的需求
  15. 00后必看:如何在互联网就业寒冬和疫情的双面夹击下找到心仪工作
  16. 目睹鸿蒙开创四大至高位面,第二十三章 鸿蒙四大至高规则
  17. Rocket Launching: A Universal and Efficient Framework for Training Well-performing Light Net论文阅读
  18. (二)Python Excel 操作
  19. python3 题解(47 定义有理数类)
  20. c语言二维数组找鞍点,C语言,二维数组 找鞍点

热门文章

  1. CentOS下修改IRedMail的邮件附件大小
  2. C# 解决上传附件大小限制
  3. linux进程挂掉 自动启动,配置systemd以在Linux崩溃后自动启动服务
  4. Oracle数据库常用语句使用记录
  5. c语言字母圣诞树,如何用C语言画一个“圣诞树”.pdf
  6. 电脑显示器的相关设置与常见故障排除方法
  7. “呼死你”重出江湖 如何避免骚扰电话?
  8. 如何临时删除桌面右键菜单上的登录画面修改
  9. 【计算机系统结构】~ ROM/PROM/EPROM/E2PROM/FLASH、SOC 片上系统、总线、CPU 处理器、Cache、DDR、ARM 体系结构、虚拟内存、内核 kernel
  10. 畜牧养殖物联网:物联网在畜牧养殖中的应用