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

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

样例输入
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.
来源
翻译自Mid-Central European Regional Contest 1999的试题

三、分析

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

四、代码

5分

今天先到这,后面再来管

 //1804:小游戏
/*
分析:
1、典型的搜索问题
2、求转弯次数+1
3、可以在方框外面走,我们我们在矩阵的基础上面包一层
4、测试数据的时候列在前面
*/ #include <iostream>
using namespace std;
//下右上左 分别对应0,1,2,3
int goHeight[]={,,-,};
int goWidth[]={,,,-}; char maze[][];
int startW,startH,endW,endH;
bool vis[][];
int w,h;
int step;//要求的结果,有几个线段
int minStep=0xfffffff;
int Board;//案例数
int Pair;//每个案例测试数 void printMaze(){
cout<<w<<" "<<h<<endl;
for(int i=;i<=h;i++){
for(int j=;j<=w;j++){
cout<<maze[i][j];
}
cout<<endl;
}
} void printVis(){
cout<<w<<" "<<h<<endl;
for(int i=;i<=h+;i++){
for(int j=;j<=w+;j++){
cout<<vis[i][j]<<" ";
}
cout<<endl;
}
} void printAns(int minStep){ if(minStep==0xfffffff){
cout<<"Pair "<<Pair++<<": impossible."<<endl;
}
else{
cout<<"Pair "<<Pair++<<": "<<minStep<<" segments."<<endl;
}
} /*
函数说明,
有当前的朝向 (下右上左 分别对应0,1,2,3 )
有当前的坐标 (保证DFS往下走)
有转弯次数+1 (结果) :是int,如果是0,说明无解,是大于0的数,则说明解释那个数
*/
void search(int startW,int startH,int direction,int step){
//cout<<"startW: "<<startW<<" startH:"<<startH<<" direction:"<<direction<<" step:"<<step<<endl;
//printVis();
if(startW==endW&&startH==endH){
if(step<minStep) minStep=step;
}
else{
//优化一:如果中间的step大于了minStep,说明肯定不是最优解
if(step>=minStep) return;
for(int i=;i<;i++){
int w1=startW+goWidth[i];
int h1=startH+goHeight[i];
if(!vis[h1][w1]&&w1>=&&w1<=w+&&h1>=&&h1<=h+){
vis[h1][w1]=true;
int stepBefore=step,directionBefore=direction;
if(direction!=i){
step++;
direction=i; }
search(w1,h1,direction,step);
//回溯
vis[h1][w1]=false;
step=stepBefore;
direction=directionBefore;
}
}
}
} int main(){
//freopen("in.txt","r",stdin);
Board=;
while(true){
/*
第一步:初始化
*/
//----------------------------------------------------------- cin>>w>>h;
if(w==&&h==) break;
cout<<"Board #"<<++Board<<":"<<endl;
//把矩阵的外面至为可访问的
for(int i=;i<=max(w,h);i++){
//左上交
vis[][i]=false;
vis[i][]=false;
//右下角:宁可杀错,也不放过
vis[h+][i]=false;
vis[w+][i]=false;
vis[i][h+]=false;
vis[i][w+]=false;
}
//输入maze
for(int i=;i<=h;i++){
getchar();
for(int j=;j<=w;j++){
char c=getchar();
maze[i][j]=c;
if(c=='X') vis[i][j]=true;
}
} Pair=; //print函数
//printMaze();
//printVis(); /*
第二步:搜索计算
*/
//--------------------------------------------------------
while(true){
minStep=0xfffffff;
cin>>startW>>startH>>endW>>endH;
if(startW==&&startH==&&endW==&&endH==) break;
//cout<<startW<<" "<<startH<<" "<<endW<<" "<<endH<<endl;
//初始化步数
step=;
//让目的地变的可走
vis[endH][endW]=false;
search(startW,startH,,step);//默认的朝向是自由的,这是从起点开始计算线段
printAns(minStep);
//上一个目的地变成可走后,到下一个测试的要变成卡片
vis[endH][endW]=true;
}
} return ;
}
/*
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赋初值
*/

五、注意点

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. SpringBoot使用H2内嵌数据库

    1.驱动 我们知道,JDBC是JDK自带的接口规范,不同的数据库有不同的实现,只需要引入相应的驱动包即可. 在使用MySQL数据库时,引入的是MySQL驱动,相应的,使用H2数据库时,也需要引入H2驱 ...

  2. 字符串 转 时间戳 unix_timestamp('2018-07-01 0:0:0')

    SELECT FROM_UNIXTIME(createtime,'%Y%m%d') AS d, s.app,SUM(o.val) FROM orders o LEFT JOIN app_type s ...

  3. C#中的自定义控件中的属性、事件及一些相关特性的总结(转)

      摘要: C#中的自定义控件中的属性(Property).事件(Event)及一些相关特性(Attribute)的总结 今天学习了下C#用户控件开发添加自定义属性的事件,主要参考了MSDN,总结并实 ...

  4. Tomcat 配置连接池

    1. Tomcat 配置 JNDI 资源 JNDI(Java Naming and Directory Interface), Java 命名和目录接口; JNDI 作用: 在服务器上配置资源, 然后 ...

  5. MySQL中myisam和innodb的主键索引有什么区别?

    MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址.下图是MyISAM索引的原理图: 这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索 ...

  6. Way to OpenSource

    @1:Follow any instructions in the readme and make sure that you can configure and run the project on ...

  7. JavaScript Promise异步实现章节的下载显示

    Links: JavaScript Promise:简介 1.一章一章顺序地下载显示下载显示 使用Array.reduce()和Promise.resolve()将各章的下载及显示作为整体串联起来. ...

  8. Python基础(17)_面向对象程序设计(抽象类、继承原理、封装、多态,绑定方法)

    一.抽象类 抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化 1.在python中实现抽象类 import abc #利用abc模块实现抽象类 class All_file(metacl ...

  9. iOS 什么是函数式编程

    前言:当前只做理解性的常规背书,根据不断深入学习会不断丰富解读内容,欢迎评论提意见 函数式编程:Functional Programming 1 基本解释: 函数式编程 是一种思维模式,一种编程思想, ...

  10. 使用CoreData存储数据

    - (void)viewDidLoad { [super viewDidLoad]; //获取模型文件的路径 NSString *path=[[NSBundle mainBundle]pathForR ...