openjudge1804 小游戏----------搜索

小游戏 题目描述 迷宫 深搜 一天早上,你起床的时候想:“我编程序这么牛,为什么不能靠这个赚点小钱呢?”因此你决定编写一个小游戏。 游戏在一个分割成w * h个正方格子的矩形板上进行。如图所示,每个正方格子上可以有一张游戏卡片,当然也可以没有。 当下面的情况满足时,我们认为两个游戏卡片之间有一条路径相连: 路径只包含水平或者竖直的直线段。路径不能穿过别的游戏卡片。但是允许路 阅读详情

原题地址

http://noi.openjudge.cn/ch0205/1804/

1804:小游戏

总时间限制: 

1000ms

内存限制: 

65536kB

描述

一天早上,你起床的时候想:“我编程序这么牛,为什么不能靠这个赚点小钱呢?”因此你决定编写一个小游戏。

游戏在一个分割成w * h个正方格子的矩形板上进行。如图所示,每个正方格子上可以有一张游戏卡片,当然也可以没有。

当下面的情况满足时,我们认为两个游戏卡片之间有一条路径相连:

路径只包含水平或者竖直的直线段。路径不能穿过别的游戏卡片。但是允许路径临时的离开矩形板。下面是一个例子: 



这里在 (1, 3)和 (4, 4)处的游戏卡片是可以相连的。而在 (2, 3) 和 (3, 4) 处的游戏卡是不相连的,因为连接他们的每条路径都必须要穿过别的游戏卡片。

你现在要在小游戏里面判断是否存在一条满足题意的路径能连接给定的两个游戏卡片。

输入

输入包括多组数据。一个矩形板对应一组数据。每组数据包括的第一行包括两个整数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.

 

作为一道中(keng)规(dian)中(ju)矩(duo)的广搜题,这题真心能把不细心的人(比如我)虐出一口老血来……

point.1 读入

正确读法有好几种,但错误读法也不是那么显然的,所以可能会有人深陷读入bug的泥潭中无法自拔。常见错误读法如下:

1. while(cin>>m>>n)会导致第二张地图读不进去(每一组里的询问的读法同理);

2. cin>>s(s为字符串) 会导致空格被忽略;

3.cin>>ch (ch为字符) 会导致空格被忽略;

4. ch=getchar()  (ch同上) 稍微改改可以,然而要注意手动忽略回车符’\n’;

正解读法用getchar()读字符,如果读到回车符就继续读。

point.2 终止条件(然而不考虑这一点竟然也能水过)

这道题并不是一道正经的模板型广搜,因为正版广搜第一次搜到终点时一定是最优解,然而这道题不同,因为如果不改变搜索路径方向,线段数是不更新的。因此搜索退出的条件只能是真的无路可走,而造成这种局面(避免循环无法终止最后T掉)的方法就是打标记——每个可行的位置都用一个二维数组记录到达该点的最少线段数,如果再次搜到这个点时发现当前解比原来的标记还大,说明没有更新的必要,这个点不可入队,否则就更新并入队。这样总有终止的时候,最后循环退出后判断终点的标记是否被更新过,如果更新过解就是此时该点的标记。

point.3 输出格式(PE的童鞋看过来)

每组数据之后输出一个空行。是每一张地图对应的询问都结束后另外输出一行空格,这是需要特殊判断的,而不是每一次询问输出后回车就行的。

point.4 初始化(5分的一种可能)

上文提到的标记数组,每次询问前都要赋成极大值;

读入的字符数组,每组数据前都要初始化为0。

解题思路

广搜,注意到上面提到的点的话应该比较好写了。

参考代码

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<queue>
#include<cstring>
using namespace std;
const int xx[5]={0,0,1,0,-1};
const int yy[5]={0,1,0,-1,0};
int vis[1000][1000];
char a[1000][1000];
 
struct mc
{
     intx,y,ans,dir;
}s,r;
 
 
int main()
{
     intn,m,num=0,cnt;
     cin>>m>>n;
     while(m&&n)
     {
         num++;
         cnt=0;
         cout<<"Board#"<<num<<":\n";
         memset(a,0,sizeof(a));
         for(int i=1;i<=n;i++)
         {
              for(int j=1;j<=m;j++)
              {
                   a[i][j]=getchar();
                   while(a[i][j]=='\n')
                   a[i][j]=getchar();
              }
         }
         intx1,y1,x2,y2;
         cin>>y1>>x1>>y2>>x2;
         while(y1&&x1&&y2&&x2)
         {
              memset(vis,0x3f,sizeof(vis));
              queue<mc>q;
              cnt++;
              s.x=x1,s.y=y1;
              r.x=x2,r.y=y2;
         s.ans=0;
         s.dir=0;
              q.push(s);
              boolff=0;
              while(!q.empty())
              {
                   intx=q.front().x;
                   inty=q.front().y;
                   intans=q.front().ans;
                   intdir=q.front().dir;
                   q.pop();
                   for(int i=1;i<=4;i++)
                   {
                       inttx=x+xx[i];
                       intty=y+yy[i];
                       mcp;
                       p.x=tx,p.y=ty,p.dir=i;
                       if(i==dir) p.ans=ans;
                       elsep.ans=ans+1;
                       if(tx<0||tx>n+1) continue;
                       if(ty<0||ty>m+1) continue;
                       if(a[tx][ty]=='X'&&(!(tx==r.x&&ty==r.y)))  continue;
                       if(vis[tx][ty]<=p.ans) continue;
                         vis[tx][ty]=p.ans;
                       if(!(tx==r.x&&ty==r.y)) q.push(p);
              //注意括号的位置,上面也一样;
                   }
              }
             if (vis[r.x][r.y]!=vis[99][99])
               cout<<"Pair"<<cnt<<": "<<vis[r.x][r.y]<<"segments.\n";
             else
                cout<<"Pair "<<cnt<<":impossible.\n";
              cin>>y1>>x1>>y2>>x2;
         }
         cin>>m>>n;
         printf("\n");
     }
}


递归---案例(小游戏poj1101) 描述 一天早上,你起床的时候想:“我编程序这么牛,为什么不能靠这个赚点小钱呢?”因此你决定编写一个小游戏。 游戏在一个分割成w * h个正方格子的矩形板上进行。如图所示,每个正方格子上可以有一张游戏卡片,当然也可以没有。 当下面的情况满足时,我们认为两个游戏卡片之间有一条路径相连: 路径只包含水平或者竖直的直线段。路径不能穿过别的游戏卡片。但是允许路径临时的离开矩形板。下面是一 阅读详情

相关推荐

递归

基本思想: 递归策略只需要少量的代码就可以描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。一般来说,构成递归需要具备以下两个条件:首先,子问题和原始问题要执行的操作应该是一致的,并且通常来说,子问题规模更小,更为简单;其次,不能无限制地调用自身,需要有一个出口,化简为非递归的情况进行处理。 斐波那契数列是一个比较典型的递归的例子,它指的是这样一个数列:0,1,1,2,3,5,8,13,21…。在数学上,斐波那契数列以如下方式定义:F[0]=0,F[1]=1,F[N]=F[N-1]+F[N-2]

Sharing_的博客 2864

OpenJudge 1804《小游戏》题解报告

一、题目链接 屠龙宝刀点击就送 二、思路 本题的路线可延伸到矩形板的外面,延伸多远都没关系。但是因为题目要求的是最小的线段数量,则伸出一个格子跟伸出多个格子没有区别。为了简单起见,伸出一个格子就好。这样就可以把原来的矩形板的面积增加一圈,即列从[1, w]扩大为[0, w+1],行从[1, h]扩大为[0, h+1]。 本题可使用广度优先搜索来解决。每个head格子出队后,周围最多有四个不同方向的...

小树学信奥 955

数学文化赏析MOOC笔记【2023】

深圳大学UOOC课程《数学文化赏析》课程笔记

simplenthpower的博客 1746

openjudge_2.5基本算法之搜索_1804:小游戏

openjudge_2.5基本算法之搜索_1804:小游戏

adam_life的博客 1263

图形学常见概念小结

前言:本文记录《unity shader入门精要》和openGL相关学习过程中一些学习要点; 文章目录PBR流程渲染管线细分着色器的底层实现,应用原理常见的色调映射算法openGl和Direct X的区别PBR流程和URP渲染管线Camera loop(剔除)MVP矩阵变换光线追踪前向渲染和延迟渲染shader和材质的区别bloom原理后处理的理解高斯模糊实现原理图像处理中的边缘检测算子 PBR流程 小结:一套基于自然界微平面理论、能量守恒、菲涅尔反射、线性空间等的科学理论所实现的基于物理的渲染系统,包含一

小谁的博客 1163

Latex参考文献中大写字母编译后自动变成了小写,如何保持原字母大写形式

bib文件参考文献中大写自动变为小写,如何保持原大写问题。Latex: 保持参考文献大小写,overleaf文献编译后,原大写字母自动变成了小写字母,如何保持原字母大写

我的个人博客 5803

搜索7--noi1804:小游戏

搜索7--noi1804:小游戏 一、心得   二、题目 1804:小游戏 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB描述一天早上,你起床的时候想:“我编程序这么牛,为什么不能靠这个赚点小钱呢?”因此你决定编写一个小游戏。游戏在一个分割成w * h个正方格子的矩形板上进行。如图所示,每个正方格子上可以有一张游戏卡片,当然...

weixin_34087503的博客 413

Chromatix_AEC—深入解析曝光表配置与传感器参数计算

本文深入解析高通Chromatix AEC模块中的曝光表配置与传感器参数计算,详细介绍了自动曝光控制(AEC)的核心概念、首行曝光时间计算、行时间与曝光模式对比、帧率计算逻辑以及曝光表高级配置技巧。通过实战案例展示如何优化传感器参数联调,帮助开发者掌握Chromatix工具在摄像头系统中的关键应用。

266

OpenJudge超详细题解,动画图文题解

内容来源于微信公众号:大神编程。已经过原文作者授权。 更新时间:2020-7-5 因为OpenJudge题库和一本通题库很多题都是一样,所以很多链接都是直接使用一本通的题解,完全不影响。 为什么要转载: 动画、图文结合。 我看了部分文章,一些我觉得很简单的题,但从中学到了以前没有学过的知识点和细节,重点是从中学习别人思维方式。 让更多的同学能学到更多的知识。 官方的QQ群:893157498 这是我建的QQ群:795233394 欢迎各位志同道合的同学们^_^ 已更新的题目颜色是蓝色,点击相

3万+

SAP CO模块实战:成本中心会计分割结构配置全流程(OKES事务码详解)

本文详细解析了SAP CO模块中成本中心会计分割结构的配置全流程,重点讲解了OKES事务码的实战操作。内容涵盖分割结构的概念理解、配置前的次级成本要素与作业类型主数据准备,并通过步骤拆解演示了如何定义分割结构、规则与版本,以及如何将配置关联到成本中心并执行分割。最后提供了常见问题排查与优化建议,旨在帮助顾问及财务人员掌握成本精确分摊的关键配置,确保期末成本核算的准确性。

embedding5hiker的博客 804

设备树实践:从零构建一个嵌入式板级的设备树描述

本文详细介绍了如何从零开始为嵌入式Linux系统构建设备树(Device Tree),以i.MX6ULL处理器为例,涵盖硬件分析、设备树语法、外设配置及调试技巧。通过实践指导,帮助开发者掌握设备树编写,实现硬件与软件的高效对接,提升嵌入式开发效率。

plum99的博客 303

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

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

adam_life的博客 903

基于C#的跨平台上位机开发:一次编写,多平台运行

摘要: 本文探讨了如何利用C#进行跨平台上位机开发,以适配Windows、Linux、macOS等多平台需求。通过分析传统单平台开发的局限性(如API差异、硬件接口兼容性),提出基于.NET 5/6/7的解决方案,重点推荐Avalonia(类WPF的跨平台UI框架)和GtkSharp(基于GTK+)实现图形界面。同时,针对硬件通信需求,介绍了System.IO.Ports串口通信和LibUsbDotNet的跨平台支持,并强调多平台调试(VS Code、Docker)的重要性,最终实现一次编码、多端部署的高效

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1404

OpenJudge noi 1804小游戏(POJ1101)

描述 一天早上,你起床的时候想:“我编程序这么牛,为什么不能靠这个赚点小钱呢?”因此你决定编写一个小游戏。 游戏在一个分割成w * h个正方格子的矩形板上进行。如图所示,每个正方格子上可以有一张游戏卡片,当然也可以没有。 当下面的情况满足时,我们认为两个游戏卡片之间有一条路径相连: 路径只包含水平或者竖直的直线段。路径不能穿过别的游戏卡片。但是允许路径临时的离开

loi_black蒟蒻的博客 1838

uniapp [全端兼容] - 实现内网使用天地图离线地图,详解项目加载天地图的离线地图服务器部署与使用教程示例源码,Uniapp如何实现天地图的离线加载部署在内网访问(兼容H5、微信小程序、App)

uniapp天地图如何离线访问,无需网络调用天地图API,天地图离线地图,天地图——内网使用离线地图,uniapp中加载天地图的离线地图,uniAPP实现天地图离线访问,在内网中无法直接使用外网天地图资源怎么办,在uni-app中加载地图 -使用天地图的瓦片数据。UNIAPP天地图离线怎么使用,内网部署天地图,天地图离线瓦片,部分瓦片数据,天地图如何离线,下载天地图离线服务,并用Uniapp+天地图离线部署,天地图私有化部署,实现离线加载天地图,Java+uniapp天地图离线开发,uniapp项目中无网络

🏆 前端领域优质创作者 4899

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

POJ-1101_The Game

The Game    POJ - 1101 题目大意:由w*h个小正方形组成的长方形板、每一个小正方形可能会包括一个游戏的块,如下图所示。     这个游戏的一个最重要的方面是判断两个块会不会由符合下列要求的路径连接。    1.路径是由直的部分组成,每个部分或水平或垂直。    2.路径不能跨过其它的游戏方块。 (路径可以包括长方形板的外延一圈) 要求找到一条

阿伟少爷 705

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

POJ 1101(优先队列)

心得·: bfs设置状态时: 在该节点变为死结点时设置状态。即在出队列的时候设置状态位,不是在入队列的时候设置状态位 输入数据有空格: 可以使用getline(), 但在使用getline之前有使用cin的话, 需要把输入中间的回车清空: 例如: while(cin >> c >> r && r){ string str; ...

weixin_44368514的博客 719

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

POJ 1101 STICKS

题意:给出n个切过的木棒,让你把把这些木棒拼成s根相同的木棒,而且木棒的长度要尽可能短 代码参考了 算法竞赛进阶指南——李煜东 详见代码: #include&lt;iostream&gt; #include&lt;cstring&gt; #include&lt;algorithm&gt; using namespace std; int n,a[100],v[100],sum,val,...

SYH001的博客 268

poj1101 the game 广搜

题目大意:   类似于连连看,问从起点到终点最少需要几条线段。   规则:     1、允许出界。     2、空格的地方才能走。 分析:   题目做下来发现没有卡时间,所以主要还是靠思路。也就是说不用考虑离线算法。直接以每个起点开始搜。 1 #include<iostream> 2 #include<cstdio> 3 #incl...

weixin_30746117的博客 241

递归--小游戏

问题描述: 一天早上,你起床的时候想,我编程这么牛,为什么不靠这个赚点小钱呢?............不在赘述。 也就是连接卡片的程序,在pku百练里面有的。 程序源代码: #include "stdio.h" #include "memory.h" #define MAXIN 75 char board[MAXIN+2][MAXIN+2];//定义面板 int minstep

--- 自由在高处 1343

[递归回溯]连接卡片最短路径

一天早上,你起床的时候想:“我编程序这么牛,为什么不能靠这个挣点银子呢?”因此你决定编写一个小游戏。游戏在一个分割成w * h个长方格子的矩形板上进行。如图所示,每个长方格子上可以有一张游戏卡片,也可以没有。当下面的情况满足时,我们认为两个游戏卡片之间有一条路径相连:路径只包含水平或者竖直的直线段。路径不能穿过别的游戏卡片。但是允许路径临时离开矩形板。下面是一个例子:这里在(1, 3)和(4, 4)处的游戏卡片是可以相连的。

StudyingPanda的博客 2152

大家看看 没有事情可以赚点小钱

http://shutter.cdream.com/register.php?linkid=201711  大家看看 没有事情可以赚点小钱 

lixianwen19891102的专栏 653

小游戏(poj) 回溯

问题传送门-&gt;The Game 解题思路 迷宫求解问题,递归求解。通过穷举方式找到从起点到终点的路径,朝一个方向走下去,如果走不通,则换一个方向走;四个方向都走不通,则回到上一步,再换一个方向走;依次走下去,直到走到终点。该问题的路径只包含水平和竖直的直线段,所以需要记录每一步走的方向。如果上一步走的方向和这一步走的方向相同,递归搜索时路径数不变,否则路径数加1. 另外根据题意,路径只包含水...

紫藤&code的博客 411

poj1101——The Game//优先队列

bfs+priority_queue可过。就说些注意点:1,priority_queue默认为升序,要重构"2,不要用vis[][]标记走过的点,因为有些点可能要多次访问;3,方向相反时,当做一次转向。#include#include#includeusing namespace std;#define maxn 80int dir[][2]={{-1,0},{

r_ax的专栏 845

poj1101 openjudge 2802:小游戏

那真的是退化了 一个简单的bfs都调了这么久。。。 题意是有h*w的矩阵 里面有空格也有X 然后指定两个坐标(这两个坐标都一定有X) 问你相连这两个点最短的segments,就是连起来的线段数,(并不是步数 ,你看看图就明白,一开始我也不是很理解样例) 真的毒瘤题 一开始就想用bfs走一遍然后记录,就想着应该bfs走的最短路径应该就是最短segment,没想到wa了 然后看了discuss 的确毒...

离开那天的博客 656

百练POJ2802小游戏

这一行的开头是“Pair m: ”,这里m是测试卡片的编号(对每个矩形板,编号都从1开始)。接下来,如果可以相连,找到连接这两个卡片的所有路径中包括线段数最少的路径,输出“k segments.”,这里k是找到的最优路径中包括的线段的数目;而在 (2, 3) 和 (3, 4) 处的游戏卡是不相连的,因为连接他们的每条路径都必须要穿过别的游戏卡片。每一步的探测方式相同,可采用枚举+递归的方式实现,每一次递归就对下一步方向进行枚举,在下一步有效的情况下,若与上一步方向相同则。但是允许路径临时的离开矩形板。

abc1152028936的博客 388
上一篇: openjudge动规刷题攻略---第2弹
下一篇: codevs1213 解的个数-----------数论/扩展欧几里得
zero_from
博客等级 码龄10年 11粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值