http://noi.openjudge.cn/_2.5基本算法之搜索_1804:小游戏

文章目录

    • 题目
    • 深搜代码
    • 宽搜代码
    • 深搜数据
    • 演示图
    • 总结

题目

1804:小游戏
总时间限制: 1000ms 内存限制: 65536kB
描述
一天早上,你起床的时候想:“我编程序这么牛,为什么不能靠这个赚点小钱呢?”因此你决定编写一个小游戏。 游戏在一个分割成w * h个正方格子的矩形板上进行。如图所示,每个正方格子上可以有一张游戏卡片,当然也可以没有。 当下面的情况满足时,我们认为两个游戏卡片之间有一条路径相连: 路径只包含水平或者竖直的直线段。路径不能穿过别的游戏卡片。但是允许路径临时的离开矩形板。下面是一个例子:
在这里插入图片描述
这里在 (1, 3)和 (4, 4)处的游戏卡片是可以相连的。而在 (2, 3) 和 (3, 4) 处的游戏卡是不相连的,因为连接他们的每条路径都必须要穿过别的游戏卡片。 你现在要在小游戏里面判断是否存在一条满足题意的路径能连接给定的两个游戏卡片。
输入
输入包括多组数据(不多于10组)。一个矩形板对应一组数据。每组数据包括的第一行包括两个整数w和h (1 <= w, h <= 75),分别表示矩形板的宽度和长度。下面的h行,每行包括w个字符,表示矩形板上的游戏卡片分布情况。使用‘X’表示这个地方有一个游戏卡片;使用空格表示这个地方没有游戏卡片。
之后的若干行上每行上包括4个整数x1, y1, x2, y2 (1 <= x1, x2 <= w, 1 <= y1, y2 <= h)。给出两个卡片在矩形板上的位置(注意:矩形板左上角的坐标是(1, 1))。输入保证这两个游戏卡片所处的位置是不相同的。如果一行上有4个0,表示这组测试数据的结束。
如果一行上给出w = h = 0,那么表示所有的输入结束了。
输出
对每一个矩形板,输出一行“Board #n:”,这里n是输入数据的编号。然后对每一组需要测试的游戏卡片输出一行。这一行的开头是“Pair m: ”,这里m是测试卡片的编号(对每个矩形板,编号都从1开始)。接下来,如果可以相连,找到连接这两个卡片的所有路径中包括线段数最少的路径,输出“k segments.”,这里k是找到的最优路径中包括的线段的数目;如果不能相连,输出“impossible.”。
每组数据之后输出一个空行。
样例输入
5 4
XXXXX
X X
XXX X
XXX
2 3 5 3
1 3 4 4
2 3 3 4
0 0 0 0
0 0
样例输出
Board #1:
Pair 1: 4 segments.
Pair 2: 3 segments.
Pair 3: impossible.

深搜代码

#include <bits/stdc++.h>
using namespace std;
struct point{int x,y,//出发行列 d,//方向 num;//线段数 
};
bool k[100][100];//标记是不是牌, 
int r,c,//地图行列 sx,sy,tx,ty, //始发和终点位置 d[4][2]={{0,-1},{-1,0},{0,1},{1,0}},//左上右下四个方向的行列变化 num[100][100];//每个点四个方向的最少线段数,要逐个逐方向更新更小值。
void view(bool k[][100]){cout<<"地图\n";cout<<" 列\t";for(int j=0;j<=c+1;j++)cout<<j<<"";cout<<endl;for(int i=0;i<=r+1;i++){cout<<i<<"行\t";for(int j=0;j<=c+1;j++)cout<<(k[i][j]?'X':' ')<<"";cout<<endl;}	
}
void view(int k[][100],int ans){cout<<"最少线段数"<<ans<<endl;cout<<" 列\t";for(int j=0;j<=c+1;j++)cout<<j<<"";cout<<endl;for(int i=0;i<=r+1;i++){cout<<i<<"行\t";for(int j=0;j<=c+1;j++)cout<<num[i][j]<<"";cout<<endl;}cout<<endl; 
}
void go(int x,int y,int f,int numx,int& ans){int x2,y2;for(int i=0;i<4;i++){x2=x+d[i][0],y2=y+d[i][1];if(x2<0||x2>r+1||y2<0||y2>c+1)continue;//不能越界 int cost=(i==f?numx:numx+1);if(cost>=ans)continue;//剪枝,超过最少线段数的线路不用考虑 if(x2==tx&&y2==ty){ans=min(ans,cost);//cout<<"OK"<<endl;view(num,ans);return;}if(k[x2][y2]||num[x2][y2])continue;//如果是牌不能穿越 num[x2][y2]=cost;//标记,并记住步数go(x2,y2,i,cost,ans); num[x2][y2]=0;//回溯 }
}
int main(){//freopen("data.cpp","r",stdin);int t1=1;while(cin>>c>>r&&(r||c)){//多组地图,全部是0才结束 cin.get();//消融行结束标记 memset(k,0,sizeof(k));//初始化整个地图,0是可以走 char cx;//地图字符 for(int i=1;i<=r;i++){for(int j=1;j<=c;j++){cx=cin.get();k[i][j]=(cx=='X'?1:0);//卡片不能走 }cin.get();//消融行结束标记}cout<<"Board #"<<t1++<<":\n";//输出组信息int t2=1,x,y,//出发行列 x2,y2;//到达行列 while(cin>>sy>>sx>>ty>>tx&&(sx||sy||tx||ty)){//多组数据,全部是0才结束 //cout<<"出发:"<<sx<<","<<sy<<"\t"<<tx<<","<<ty<<endl;memset(num,0,sizeof(num));//各点初始化为最大值 int ans=0x3f3f3f;//0x3f=63,不够大,0x3f3f3f=4194303够了//view(k);go(sx,sy,-1,0,ans);cout<<"Pair "<<t2++<<": ";if(ans==0x3f3f3f)cout<<"impossible.\n";else cout<<ans<<" segments.\n"; }cout<<endl;//每组地图后有空行 } return 0;
}

宽搜代码

#include <bits/stdc++.h>
using namespace std;
struct point{int x,y,//出发行列 d,//方向 num;//线段数 
};
bool k[100][100];//标记是不是牌, 
int r,c,//地图行列 sx,sy,tx,ty, //始发和终点位置 d[4][2]={{0,-1},{-1,0},{0,1},{1,0}},//左上右下四个方向的行列变化 num[100][100][4];//每个点四个方向的最少线段数,要逐个逐方向更新更小值。
int main(){//freopen("data2.cpp","r",stdin);int t1=1;while(cin>>c>>r&&(r||c)){//多组地图,全部是0才结束 cin.get();//消融行结束标记 memset(k,0,sizeof(k));//初始化整个地图,0是可以走 char cx;//地图字符 for(int i=1;i<=r;i++){for(int j=1;j<=c;j++){cx=cin.get();if(cx=='X')k[i][j]=1;//k[i][j]=(cx=='X'?1:0);//卡片不能走 }cin.get();//消融行结束标记}cout<<"Board #"<<t1++<<":\n";//输出组信息int t2=1,x,y,//出发行列 x2,y2;//到达行列 while(cin>>sy>>sx>>ty>>tx&&(sx||sy||tx||ty)){//多组数据,全部是0才结束 memset(num,0x3f3f3f,sizeof(num));//各点初始化为最大值 queue<point> q;//宽搜队列 q.push(point{sx,sy,-1,0});//出发,下次方向都算不同,就会0+1多个线路for(int i=0;i<4;i++)num[sx][sy][i]=0;//出发位置各方向无线段 int ans=0x3f3f3f,//找最少线段数 cost;//中间值,存线段数变化结果 while(!q.empty()){point p=q.front();q.pop();x=p.x,y=p.y;for(int i=0;i<4;i++){//四个方向逐个尝试 x2=x+d[i][0],y2=y+d[i][1];if(x2<0||x2>r+1||y2<0||y2>c+1)continue;//出界 cost=(p.d==i?p.num:p.num+1);//方向一样线段数不变,否则多条线段 if(x2==tx&&y2==ty){//到达目标 if(num[x2][y2][i]>cost)num[x2][y2][i]=cost;ans=min(ans,cost);//更新最终最少线段数 }if(k[x2][y2])continue;//不能穿越牌if(num[x2][y2][i]>cost){//更少的线段数才更新并出发。 num[x2][y2][i]=cost;//更新该点i方向上的最少线段数 q.push(point{x2,y2,i,cost});//从新达点出发 }}}cout<<"Pair "<<t2++<<": ";if(ans==0x3f3f3f)cout<<"impossible.\n";else cout<<ans<<" segments.\n"; }cout<<endl;//每组地图后有空行 } return 0;
}

深搜数据

地图列     01234567
01行       XXXX
2行         XX
3行      XX  X
4行      XXX  X
5行
Board #1:
出发:3,1       4,6
地图列     01234567
01行       XXXX
2行         XX
3行      XX  X
4行      XXX  X
5行
OK
最少线段数1001234567
023333333
120000054
220000067
310000098
400000000
500000000OK
最少线段数901234567
023333333
120000054
220000067
310000008
400000008
500000000OK
最少线段数601234567
023333333
120000054
220000060
310000060
400000000
500000000OK
最少线段数501234567
023333333
120000004
220000004
310000004
400000004
500000000OK
最少线段数401234567
023333330
120000040
220000040
310000040
400000000
500000000OK
最少线段数301234567
001222220
101000030
201000030
300000030
400000000
500000000Pair 1: 3 segments.

演示图

在这里插入图片描述

总结

1.问的不是步数,而是线段数
2.出发到到达方向一样,是一条线段,
不一样是两条线段
所以出发位置得带方向
3.宽搜,从不同方向到达该点,用更少线段数更新。不少不更新
例:短距离多线段,上2右1下1右1下1左2可达目标,是6线段
长距离少线段,上2右2下2左2,是4线段
4.数组得初始化。
如果用字符数组表示地图,外延得初始化,否则有可能是’X’,不能通过。
5.从大开始找最小,
初始化整型数组(各点最少线段数num[100][100][4]),可以用 memset(num,0X3f3f3f,sizeof(num))
十六进制0X3f=整数63,不够大.
十六进制0X3f3f3f=整数4194303.
再大就得逐一赋值。
6.深搜就是尝试所有的情况,关键就是剪

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/900355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

发生梯度消失, 梯度爆炸问题的原因,怎么解决?

目录 一、梯度消失的原因 二、梯度爆炸的原因 三、共同的结构性原因 四、解决办法 五、补充知识 一、梯度消失的原因 梯度消失指的是在反向传播过程中&#xff0c;梯度随着层数的增加指数级减小&#xff08;趋近于0&#xff09;&#xff0c;导致浅层网络的权重几乎无法更新…

【USRP】srsRAN 开源 4G 软件无线电套件

srsRAN 是SRS开发的开源 4G 软件无线电套件。 srsRAN套件包括&#xff1a; srsUE - 具有原型 5G 功能的全栈 SDR 4G UE 应用程序srsENB - 全栈 SDR 4G eNodeB 应用程序srsEPC——具有 MME、HSS 和 S/P-GW 的轻量级 4G 核心网络实现 安装系统 Ubuntu 20.04 USRP B210 sudo …

ChatGPT 4:解锁AI文案、绘画与视频创作新纪元

文章目录 一、ChatGPT 4的技术革新二、AI文案创作&#xff1a;精准生成与个性化定制三、AI绘画艺术&#xff1a;从文字到图像的神奇转化四、AI视频制作&#xff1a;自动化剪辑与创意实现五、知识库与ChatGPT 4的深度融合六、全新的变革和机遇《ChatGPT 4 应用详解&#xff1a;A…

在js中数组相关用法讲解

数组 uniqueArray 简单数组去重 /*** 简单数组去重* param arr* returns*/ export const uniqueArray <T>(arr: T[]) > [...new Set(arr)];const arr1 [1,1,1,1 2, 3];uniqueArray(arr); // [1,2,3]uniqueArrayByKey 根据 key 数组去重 /*** 根据key数组去重* …

RT-Thread ulog 日志组件深度分析

一、ulog 组件核心功能解析 轻量化与实时性 • 资源占用&#xff1a;ulog 核心代码仅需 ROM<1KB&#xff0c;RAM<0.2KB&#xff0c;支持在资源受限的MCU&#xff08;如STM32F103&#xff09;中运行。 • 异步/同步模式&#xff1a;默认采用异步环形缓冲区&#xff08;rt_…

T113s3远程部署Qt应用(dropbear)

T113-S3 是一款先进的应用处理器&#xff0c;专为汽车和工业控制市场而设计。 它集成了双核CortexTM-A7 CPU和单核HiFi4 DSP&#xff0c;提供高效的计算能力。 T113-S3 支持 H.265、H.264、MPEG-1/2/4、JPEG、VC1 等全格式解码。 独立的硬件编码器可以编码为 JPEG 或 MJPEG。 集…

12.青龙面板自动化我的生活

安装 docker方式 docker run -dit \ -v /root/ql:/ql/data \ -p 5700:5700 \ -e ENABLE_HANGUPtrue \ -e ENABLE_WEB_PANELtrue \ --name qinglong \ --hostname qinglong \ --restart always \ whyour/qinglongk8s方式 https://truecharts.org/charts/stable/qinglong/ he…

Maven 远程仓库推送方法

步骤 1&#xff1a;配置 pom.xml 中的远程仓库地址 在项目的 pom.xml 文件中添加 distributionManagement 配置&#xff0c;指定远程仓库的 URL。 xml 复制 <project>...<distributionManagement><!-- 快照版本仓库 --><snapshotRepository><id…

Spring Boot 日志 配置 SLF4J 和 Logback

文章目录 一、前言二、案例一&#xff1a;初识日志三、案例二&#xff1a;使用Lombok输出日志四、案例三&#xff1a;配置Logback 一、前言 在开发 Java 应用时&#xff0c;日志记录是不可或缺的一部分。日志可以记录应用的运行状态、错误信息和调试信息&#xff0c;帮助开发者…

JS API 事件监听

焦点事件案例&#xff1a;搜索框激活下拉菜单 事件对象 事件对象存储事件触发时的相关信息 可以判断用户按键&#xff0c;点击元素等内容 如何获取 事件绑定的回调函数中的第一个形参就是事件对象 一般命名为e,event 事件对象常用属性 type类型 click mouseenter client…

DDD与MVC扩展能力对比

一、架构设计理念的差异二、扩展性差异的具体表现三、DDD扩展性优势的深层原因四、MVC扩展性不足的典型场景五、总结&#xff1a;架构的本质与选择六、例子1&#xff09;场景描述2&#xff09;MVC实现示例&#xff08;三层架构&#xff09;3&#xff09;DDD实现示例&#xff08…

针对 SQL 查询中 IN 子句性能优化 以及 等值 JOIN 和不等值 JOIN 对比 的详细解决方案、代码示例及表格总结

以下是针对 SQL 查询中 IN 子句性能优化 以及 等值 JOIN 和不等值 JOIN 对比 的详细解决方案、代码示例及表格总结&#xff1a; 问题 1&#xff1a;IN 的候选值过多&#xff08;如超过 1000 个&#xff09; 问题描述 当 IN 列表中的值过多时&#xff0c;SQL 会逐个比较每个值…

手部穴位检测技术:基于OpenCV和MediaPipe的实现

手部穴位检测是医学和健康管理领域的重要技术之一。通过准确识别手部的关键穴位,可以为中医诊断、康复治疗以及健康监测提供支持。本文将介绍一种基于OpenCV和MediaPipe的手部穴位检测方法,展示如何利用计算机视觉技术实现手部关键点的检测,并进一步标注手部的穴位位置。 技…

Day20 -自动化信息收集工具--ARL灯塔的部署

准备&#xff1a; 纯净的Docker环境 ARL的包 一、Docker的部署 00x1 更新系统包 sudo apt update 00x2 安装必要的依赖包 sudo apt install -y apt-transport-https ca-certificates curl software-properties-common 00x3 下载docker和docker-compose apt-get install do…

sqlalchemy查询json

第一种&#xff1a;字段op是json格式&#xff1a; {"uid": "cxb123456789","role": 2,"op_start_time": 1743513707504,"op_end_time": 1743513707504,"op_start_id": "op_001","op_end_id"…

搭建K8S-1.23

0、简介 这里只用3台服务器来做一个简单的集群 地址主机名192.168.160.40kuber-master-1192.168.160.41kuber-master-2192.168.160.42kuber-node-1 1、关闭三个服务 &#xff08;1&#xff09;防火墙 systemctl stop firewalld &#xff08;2&#xff09;Selinux setenf…

初阶数据结构--树

1. 树的概念与结构 树是⼀种⾮线性的数据结构&#xff0c;它是由 n&#xff08;n>0&#xff09; 个有限结点组成⼀个具有层次关系的集合。把它叫做 树是因为它看起来像⼀棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;⽽叶朝下的。 有⼀个特殊的结点&#xff0c;称…

硬件工程师面试问题(五):蓝牙面试问题与详解

蓝牙技术作为物联网与智能设备的核心无线协议&#xff0c;其硬件设计能力直接影响产品连接稳定性、功耗及兼容性。面试是评估候选人射频电路设计、天线优化、协议栈调试等综合技能的关键环节&#xff0c;尤其在BLE低功耗设计、共存抗干扰等场景中&#xff0c;硬件工程师的实践经…

Redis-基本数据类型

Redis支持的基本数据类型&#xff1a;String、hash、list、Set、Zset 一、String 特点 可以存储三种类型 int、float、string 运用场景 缓存&#xff1a;存储HTML片段、用户会话&#xff08;Session&#xff09;计数器&#xff1a;网站访问量、点赞数&#xff08;incr方法&am…

Tomcat的部署

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和 并发访问用户不是很多的场合下被普遍使用&#xff0c;Tomcat 具有处理HTML页面的功能&#xff0c;它还是一个Servlet和 JSP容器 官网:Apache Tomcat - Welco…