搜索7--noi1804:小游戏

一、心得

二、题目

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.”。

每组数据之后输出一个空行。

样例输入
  1. 5 4
  2. XXXXX
  3. X X
  4. XXX X
  5. XXX
  6. 2 3 5 3
  7. 1 3 4 4
  8. 2 3 3 4
  9. 0 0 0 0
  10. 0 0
样例输出
  1. Board #1:
  2. Pair 1: 4 segments.
  3. Pair 2: 3 segments.
  4. Pair 3: impossible.
来源
翻译自Mid-Central European Regional Contest 1999的试题

三、分析

分析:
1、典型的搜索问题
2、求转弯次数+1
3、可以在方框外面走,我们我们在矩阵的基础上面包一层
4、测试数据的时候列在前面

四、代码

5分

今天先到这,后面再来管

  1. //1804:小游戏
  2. /*
  3. 分析:
  4. 1、典型的搜索问题
  5. 2、求转弯次数+1
  6. 3、可以在方框外面走,我们我们在矩阵的基础上面包一层
  7. 4、测试数据的时候列在前面
  8. */
  9.  
  10. #include <iostream>
  11. using namespace std;
  12. //下右上左 分别对应0,1,2,3
  13. int goHeight[]={,,-,};
  14. int goWidth[]={,,,-};
  15.  
  16. char maze[][];
  17. int startW,startH,endW,endH;
  18. bool vis[][];
  19. int w,h;
  20. int step;//要求的结果,有几个线段
  21. int minStep=0xfffffff;
  22. int Board;//案例数
  23. int Pair;//每个案例测试数
  24.  
  25. void printMaze(){
  26. cout<<w<<" "<<h<<endl;
  27. for(int i=;i<=h;i++){
  28. for(int j=;j<=w;j++){
  29. cout<<maze[i][j];
  30. }
  31. cout<<endl;
  32. }
  33. }
  34.  
  35. void printVis(){
  36. cout<<w<<" "<<h<<endl;
  37. for(int i=;i<=h+;i++){
  38. for(int j=;j<=w+;j++){
  39. cout<<vis[i][j]<<" ";
  40. }
  41. cout<<endl;
  42. }
  43. }
  44.  
  45. void printAns(int minStep){
  46.  
  47. if(minStep==0xfffffff){
  48. cout<<"Pair "<<Pair++<<": impossible."<<endl;
  49. }
  50. else{
  51. cout<<"Pair "<<Pair++<<": "<<minStep<<" segments."<<endl;
  52. }
  53. }
  54.  
  55. /*
  56. 函数说明,
  57. 有当前的朝向 (下右上左 分别对应0,1,2,3 )
  58. 有当前的坐标 (保证DFS往下走)
  59. 有转弯次数+1 (结果) :是int,如果是0,说明无解,是大于0的数,则说明解释那个数
  60. */
  61. void search(int startW,int startH,int direction,int step){
  62. //cout<<"startW: "<<startW<<" startH:"<<startH<<" direction:"<<direction<<" step:"<<step<<endl;
  63. //printVis();
  64. if(startW==endW&&startH==endH){
  65. if(step<minStep) minStep=step;
  66. }
  67. else{
  68. //优化一:如果中间的step大于了minStep,说明肯定不是最优解
  69. if(step>=minStep) return;
  70. for(int i=;i<;i++){
  71. int w1=startW+goWidth[i];
  72. int h1=startH+goHeight[i];
  73. if(!vis[h1][w1]&&w1>=&&w1<=w+&&h1>=&&h1<=h+){
  74. vis[h1][w1]=true;
  75. int stepBefore=step,directionBefore=direction;
  76. if(direction!=i){
  77. step++;
  78. direction=i;
  79.  
  80. }
  81. search(w1,h1,direction,step);
  82. //回溯
  83. vis[h1][w1]=false;
  84. step=stepBefore;
  85. direction=directionBefore;
  86. }
  87. }
  88. }
  89. }
  90.  
  91. int main(){
  92. //freopen("in.txt","r",stdin);
  93. Board=;
  94. while(true){
  95. /*
  96. 第一步:初始化
  97. */
  98. //-----------------------------------------------------------
  99.  
  100. cin>>w>>h;
  101. if(w==&&h==) break;
  102. cout<<"Board #"<<++Board<<":"<<endl;
  103. //把矩阵的外面至为可访问的
  104. for(int i=;i<=max(w,h);i++){
  105. //左上交
  106. vis[][i]=false;
  107. vis[i][]=false;
  108. //右下角:宁可杀错,也不放过
  109. vis[h+][i]=false;
  110. vis[w+][i]=false;
  111. vis[i][h+]=false;
  112. vis[i][w+]=false;
  113. }
  114. //输入maze
  115. for(int i=;i<=h;i++){
  116. getchar();
  117. for(int j=;j<=w;j++){
  118. char c=getchar();
  119. maze[i][j]=c;
  120. if(c=='X') vis[i][j]=true;
  121. }
  122. }
  123.  
  124. Pair=;
  125.  
  126. //print函数
  127. //printMaze();
  128. //printVis();
  129.  
  130. /*
  131. 第二步:搜索计算
  132. */
  133. //--------------------------------------------------------
  134. while(true){
  135. minStep=0xfffffff;
  136. cin>>startW>>startH>>endW>>endH;
  137. if(startW==&&startH==&&endW==&&endH==) break;
  138. //cout<<startW<<" "<<startH<<" "<<endW<<" "<<endH<<endl;
  139. //初始化步数
  140. step=;
  141. //让目的地变的可走
  142. vis[endH][endW]=false;
  143. search(startW,startH,,step);//默认的朝向是自由的,这是从起点开始计算线段
  144. printAns(minStep);
  145. //上一个目的地变成可走后,到下一个测试的要变成卡片
  146. vis[endH][endW]=true;
  147. }
  148. }
  149.  
  150. return ;
  151. }
  152. /*
  153. 1、
  154. 输入为:5 4
  155. cin>>m>>n;后
  156. 如果用getchar()读取,读到的是行尾的"/n";
  157. 2、
  158. 目的点是有卡片的,默认情况不能走,我们要让它可走
  159. vis[endH][endW]=false;
  160. 3、
  161. 这里是所有解中的最优解,所以是回溯而非DFS
  162. 那就要记录所有解,找到最优解
  163. 4、
  164. 优化一:如果中间的step大于了minStep,说明肯定不是最优解
  165. if(step>=minStep) return;
  166. 5、
  167. 上一个目的地变成可走后,到下一个测试的要变成卡片
  168. 6、
  169. 在每个起点终点测试的前面,要给minStep赋初值
  170. */

五、注意点

1、
输入为:5 4
cin>>m>>n;后
如果用getchar()读取,读到的是行尾的"/n";
2、
目的点是有卡片的,默认情况不能走,我们要让它可走
vis[endH][endW]=false;
3、
这里是所有解中的最优解,所以是回溯而非DFS
那就要记录所有解,找到最优解
4、
优化一:如果中间的step大于了minStep,说明肯定不是最优解
if(step>=minStep) return;
5、
上一个目的地变成可走后,到下一个测试的要变成卡片
6、
在每个起点终点测试的前面,要给minStep赋初值

搜索7--noi1804:小游戏的更多相关文章

  1. 自制Unity小游戏TankHero-2D(4)关卡+小地图图标+碰撞条件分析

    自制Unity小游戏TankHero-2D(4)关卡+小地图图标+碰撞条件分析 我在做这样一个坦克游戏,是仿照(http://game.kid.qq.com/a/20140221/028931.htm ...

  2. 两个Canvas小游戏

    或许连小游戏都算不上,可以叫做mini游戏. 没有任何框架或者稍微有点深度的东西,所以有js基础的或者要追求炫酷效果的可以直接ctrl+w了. 先贴出两个游戏的试玩地址: 是男人就走30步 是男人就忍 ...

  3. OpenJudge 2802 小游戏 / Poj 1101 The Game

    1.链接地址: http://bailian.openjudge.cn/practice/2802 http://poj.org/problem?id=1101 2.题目: 总时间限制: 1000ms ...

  4. javascrpit开发连连看记录-小游戏

        工作之余,总想做点什么有意思的东西.但是苦于不知道做什么,也就一直没有什么动作.在一个午饭后,跟@jedmeng和@墨尘聊天过程中,发现可以写一些小东西来练练手,有以下几点好处:     1. ...

  5. 【C语言探索之旅】 第一部分第八课:第一个C语言小游戏

    ​ 内容简介 1.课程大纲 2.第一部分第八课:第一个C语言小游戏 3.第一部分第九课预告: 函数 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写 ...

  6. 2048小游戏代码解析 C语言版

    2048小游戏,也算是风靡一时的益智游戏.其背后实现的逻辑比较简单,代码量不算多,而且趣味性强,适合作为有语言基础的童鞋来加强编程训练.本篇分析2048小游戏的C语言实现代码. 前言 游戏截图:  游 ...

  7. 使用Laya引擎开发微信小游戏(下)

    本文由云+社区发表 6. 动画 6.1 创建伞兵对象 在src目录下创建一个新目录role,用来存放游戏中角色. 在role里创建一个伞兵Soldier.ts对象文件. module role{ ex ...

  8. 腾讯云 Game-Tech 技术沙龙小游戏专场“空降”长沙

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云发表于云+社区专栏 小游戏作为今年快速成长的新生态,在开放进入市场之后持续成为行业热点,获得了游戏开发商的高度关注与参与.在 ...

  9. .Net Core ORM选择之路,哪个才适合你 通用查询类封装之Mongodb篇 Snowflake(雪花算法)的JavaScript实现 【开发记录】如何在B/S项目中使用中国天气的实时天气功能 【开发记录】微信小游戏开发入门——俄罗斯方块

    .Net Core ORM选择之路,哪个才适合你   因为老板的一句话公司项目需要迁移到.Net Core ,但是以前同事用的ORM不支持.Net Core 开发过程也遇到了各种坑,插入条数多了也特别 ...

随机推荐

  1. JavaScript数据结构与算法-队列练习

    队列的实现 // 队列类 function Deque () { this.dataStore = []; this.enqueueFront = enqueueFront; this.enqueue ...

  2. 超出字数部分省略(主要解决不兼容;display: -webkit-box;的浏览器)

    注明:内容于http://www.cnblogs.com/chentongtong/p/5474553.html进一步整理. 1.现webkit内核的浏览器支持display: -webkit-box ...

  3. javafx tableview 设置多选

    id_resultTable.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);

  4. Integrate-And-Fire Models(转)

    Integrate-And-Fire Models 基础知识 轴突:动作电位(电位差形成电流)=神经递质发放=脉冲产生树突或细胞体:神经递质的接受=产生内外膜电位差(电流产生)=接收脉冲脉冲编码:多采 ...

  5. 20170524 委外采购的物料BOM

    目标:找委外采购订单BOM, 我的方法:1.直接在电脑中搜索关键字:2.到系统中找数据查询3.委外采购订单系统如何操作? 数据怎么做, 实施: 结果:MDBAEKET, "采购订单项目计划行 ...

  6. shuit模块

    shuit模块 #高级的 文件.文件夹.压缩包 处理模块 shutil.copyfileobj(fsrc, fdst[, length])将文件内容拷贝到另一个文件中,可以部分内容 def copyf ...

  7. 面向对象高级编程——使用@property

    在绑定属性的时候,如过我们直接把属性暴露出去,虽然写起来简单,但是,没办法检查参数,导致可以把成绩随意改: s = Student() s.score = 9999 #不符合常规依然可以更改 这显然不 ...

  8. PL/SQL连接ORACLE失败,ORA-12154: TNS: could not resolve the connect identifier specified

    项目需要使用ORACLE,安装了oracle之后,使用PL/SQL连接,先是提示NOT logger  ,后续不知道改了什么提示解析服务器id失败,重新装了之后更狠的直接来了个空白提示 一.安装PLS ...

  9. image has dependent child images

    在删除镜像之前要先用 docker rm 删掉依赖于这个镜像的所有容器(哪怕是已经停止的容器),否则无法删除该镜像. 停止容器 # docker stop $(docker ps -a | grep ...

  10. sorted 、 filter 、 map

    sorted   排序函数 内置函数中提供了一个通用的排序方案 ,返回一个新的列表,不会改变原数据 语法: sorted(iterable, key, reverse) key: 排序方案, sort ...