之前使用的是递归的方法来解决的问题,后来有点想用bfs(宽度优先搜索来尝试一下的想法,在网上看到有人使用了dfs(深度优先搜索)更加坚定了自己的这种想法。

这个方法首先是以顶点的四组开始,加入那些没有放置卡片的位置,同时使用另外一个数组来标记距离,就这样一直拓展下去,如果碰到了目标位置,那么我们就对totalStep进行对比赋值。

切记,每次搜索结束后,要对标记数组重新赋值,每个Board结束后,要对队列清空。

#include <bits/stdc++.h>
using namespace std;
class Node{
//int direct,step;
public:
int x,y;
Node(int x_,int y_):x(x_),y(y_){}
};
class directNode{
public:
int direct,step;
directNode(int direct_,int step_):direct(direct_),step(step_){}
};
int w,h;
char s[][];
int mark[][];
directNode * directStep[][];
int direction[][]={{-,},{,},{,},{,-}};
int totalStep=;
queue<Node *> ques;
void findTotalPath(int x1,int y1,int x2,int y2,int direct,int step){
while(ques.size()>){
Node * temp=ques.front();
//cout<<temp->x<<"-"<<temp->y<<endl;
if(temp->x==x2&&temp->y==y2){
if(totalStep>directStep[temp->y][temp->x]->step&&directStep[temp->y][temp->x]->step!=){
totalStep=directStep[temp->y][temp->x]->step;
continue;
}
}
for(int i=;i<;i++){
int xx1=temp->x+direction[i][];
int yy1=temp->y+direction[i][];
if((xx1>-)&&(xx1<w+)&&(yy1>-)&&(yy1<h+)&&(s[yy1][xx1]==' '||(yy1==y2&&xx1==x2&&s[yy1][xx1]=='X'))){
//cout<<"* "<<directStep[temp->y][temp->x]->step<<","<<directStep[temp->y][temp->x]->direct<<endl;
int tempStep=directStep[temp->y][temp->x]->direct!=i?directStep[temp->y][temp->x]->step+:directStep[temp->y][temp->x]->step;
if(mark[yy1][xx1]==){
if(directStep[yy1][xx1]->step>tempStep){
directStep[yy1][xx1]->direct=i;
directStep[yy1][xx1]->step=tempStep;
}
}else{
ques.push(new Node(xx1,yy1));
directStep[yy1][xx1]->direct=i;
directStep[yy1][xx1]->step=tempStep;
mark[yy1][xx1]=;
//cout<<xx1<<" "<<yy1<<endl;
//cout<<"tempStep:"<<tempStep<<endl;
}
}
}
ques.pop();
}
}
int main(){
int id=;
while(){
/*cin>>w>>h;
cin.ignore();*/
scanf("%d %d",&w,&h);
if(w==&&h==) break;
/*for(int i=0;i<h+2;i++){
s[i][0]=s[i][w+1]=' ';
}
for(int j=0;j<w+2;j++){
s[0][j]=s[w+1][j]=' ';
}*/
for(int i=;i<h+;i++){
for(int j=;j<w+;j++){
directStep[i][j]=new directNode(-,);
}
}
for (int i = ; i <; i ++) s[][i] =s[i][] = ' ';
for(int i=;i<h+;i++){
getchar();
//string str="";
//getline(cin,str);
for(int j=;j<w+;j++){
//s[i][j]=str[j-1];
s[i][j]=getchar();
}
}
for (int i = ; i <= w; i ++)
s[h + ][i + ] = ' ';
for (int i = ; i <= h; i ++)
s[i + ][w + ] = ' ';
cout<<"Board #"<<id<<":"<<endl;
id++;
int x1,y1,x2,y2;
int subId=;
while(){
subId++;
totalStep=;
memset(mark, , sizeof(mark));
cin>>x1>>y1>>x2>>y2;
ques.push(new Node(x1,y1));
mark[y1][x1]=;
if(x1==&&y1==&&x2==&&y2==) break;
int step=;
int direct=-;
findTotalPath(x1,y1,x2,y2,direct,step);
if(totalStep<)
cout<<"Pair "<<subId<<": "<<totalStep<<" segments."<<endl;
else{
cout<<"Pair "<<subId<<": "<<"impossible."<<endl;
}
for(int i=;i<h+;i++){
for(int j=;j<w+;j++){
directStep[i][j]=new directNode(-,);
}
}
}
while(ques.size()>){
ques.pop();
}
cout<<endl;
}
}

2802:小游戏利用bfs来实现的更多相关文章

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

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

  2. 分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”

    这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...

  3. 了解python,利用python来制作日常猜拳,猜价小游戏

    初次接触python,便被它简洁优美的语言所吸引,正所谓人生苦短,python当歌.python之所以在最近几年越发的炽手可热,离不开它的一些特点: 1.易于学习:Python有相对较少的关键字,结构 ...

  4. 【转】利用 three.js 开发微信小游戏的尝试

    前言 这是一次利用 three.js 开发微信小游戏的尝试,并不能算作是教程,只能算是一篇笔记吧. 微信 WeChat 6.6.1 开始引入了微信小游戏,初期上线了一批质量相当不错的小游戏.我在查阅各 ...

  5. 推箱子小游戏《格鲁的实验室》13关 - bfs最短路径

    下载了一款推箱子小游戏,第13关的时候怎么也破不了最佳纪录(最少步数是9而我们最好的方案是10步),因为数据比较小(6*8的方阵),所以写了个BFS来找最短路. 游戏的目标是把小黄人推到黄色球,小绿人 ...

  6. C语言-纸牌计算24点小游戏

    C语言实现纸牌计算24点小游戏 利用系统时间设定随机种子生成4个随机数,并对4个数字之间的运算次序以及运算符号进行枚举,从而计算判断是否能得出24,以达到程序目的.程序主要功能已完成,目前还有部分细节 ...

  7. 软件工程:黄金G点小游戏1.0

    我们要做的是黄金G点小游戏: N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值. ...

  8. flash小游戏在Kongregate上线——BasketBall Master(篮球大师)

    小游戏地址,欢迎上去留言评论.游戏完成度没有达到期望水平,只能算完成了核心玩法吧,一些其他构想来不及实现. BasketBall Master(篮球大师) 这个小游戏很早之前就基本做好了,只因有些细节 ...

  9. 软件工程 Android小游戏 猜拳大战

    一.前言 最近学校举办的大学生程序设计竞赛,自己利用课余时间写了一个小游戏,最近一直在忙这个写这个小游戏,参加比赛,最终是老师说自己写的简单,可以做的更复杂的点的.加油 二.内容简介 自己玩过Andr ...

随机推荐

  1. DRF之项目搭建

    DRF,全称Django Restful Framework,是一个基于Django的Restful接口框架,是主要用来做API接口的,为前端提供数据的接口.在前面一片博客中,我们构建了一个vue的项 ...

  2. 简化开发:Lombok的使用

    Java中优雅的使用Lombok 1.简介 Lombok 是一种 Java实用工具,可用来帮助开发人员消除Java的冗长,尤其是对于简单的Java对象(POJO), 它通过注释实现这一目的.一个标准的 ...

  3. Hangfire定时任务设置CronExpression表达式

    Cron format helper This utility helps you build Cron expressions easily by choosing job scheduling s ...

  4. 【Java每日一题】20170120

    20170119问题解析请点击今日问题下方的“[Java每日一题]20170120”查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; import jav ...

  5. java动态获取WebService的两种方式(复杂参数类型)

    java动态获取WebService的两种方式(复杂参数类型) 第一种: @Override public OrderSearchListRes searchOrderList(Order_Fligh ...

  6. Java中的匿名内部类及内部类的二三事

    匿名内部类适合创建那些只需要使用一次的类,它的语法有些奇怪,创建匿名内部类会立即创建一个该类的实例,这个类定义立即消失,且不能重复使用. 定义匿名类的格式如下: new 实现接口() |父类构造器(实 ...

  7. 10个常见的JavaScript BUG

    译者按: 安全起见,在开发中我基本不用==. 原文: 10 COMMON JAVASCRIPT BUGS AND HOW TO AVOID THEM 译者: Fundebug 为了保证可读性,本文采用 ...

  8. JQuery禁止/恢复按钮readonly和disabled小结

    禁止/恢复按钮 其实就是更改 <input> 的属性. 禁用 id 为 btn 的按钮:  代码如下 复制代码 $("#btn").attr({"disabl ...

  9. angular 设置年份选择下拉框,并默认今年

    <select ng-model="selectedYear" ng-change="yearChange(selectedYear)"> < ...

  10. element vue Array数组和Map对象的添加与删除

    使用场景: 一个后台系统中, 管理员要配置自定义字段后台要生成id和title,其他角色要使用自定义字段的表单, 添加数据, 但是每个要填写的对象的id 和title都是无法固定的,因此页面显示的ti ...