之前使用的是递归的方法来解决的问题,后来有点想用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. Perl的数值和字符串

    数值和字符串 数值 perl中以双精度(浮点数)方式保存和运算数值的方式 就算写的是整数,在内部也会转换成等效的浮点数类型保存. 但在perl内部,有些运算会将浮点数转换成整型进行,而且也有integ ...

  2. 数据挖掘(二)——Knn算法的java实现

    1.K-近邻算法(Knn) 其原理为在一个样本空间中,有一些已知分类的样本,当出现一个未知分类的样本,则根据距离这个未知样本最近的k个样本来决定. 举例:爱情电影和动作电影,它们中都存在吻戏和动作,出 ...

  3. OpenCV入门之获取图像的旋转角度

      在我们的日常生活中,所碰到的图像往往都有一定的倾斜.那么,如何用OpenCV来获取图像的旋转角度呢?   我们以下面的图片为例,简单介绍如何用OpenCV来获取图像的旋转角度.   可以看到,该图 ...

  4. Code First下迁移数据库更改

    第一步:Enable-Migrations -ContextTypeName [你的项目名].[你的数据库上下文] -Force 其中-Force为强制覆盖现有迁移配置 第二步:Add-Migrati ...

  5. surging+CentOS7+docker+rancher2.0 入门部署教程

    准备工作 开发环境  Visual Studio 2017 15.5 运行环境  虚拟机CentOS 7+Docker+Rancher 2.0+Consul+RabbmitMQ 项目下载地址  htt ...

  6. DirBuste 使用

    https://sourceforge.net/projects/dirbuster/ 官网下载 记得安装java 运行环境 这是扫描 443 端口的数据 也可以自己写字典规则 在选择模糊查询时 下面 ...

  7. Discuz网警过滤关键词库

    积累近几年discuz关键词过滤 使用方法:1.进入后台/内容/词语过滤批量添加.2.打开CensorWords.txt,复制里面的文本信息到批量添加的输入框内,点击确定即可.如图: 关键词下载:Ke ...

  8. 4.2 explain 之 select_type

    一.查询类型,主要用于区别 普通查询.联合查询.子查询等的复杂查询 二.常用常见的类型 1. simple : 简单的select查询,查询中不包含子查询或union 2. primary : 查询中 ...

  9. 【Spring】31、Spring的EL表达式

    一.简介 Spring3中引入了Spring表达式语言—SpringEL,SpEL是一种强大,简洁的装配Bean的方式,他可以通过运行期间执行的表达式将值装配到我们的属性或构造函数当中,更可以调用JD ...

  10. MySQL添加新用户、为用户创建数据库、为新用户分配权限

    登录MySQL [root@VM_0_2_33_centos /]#mysql -u root -p 添加新用户 允许本地 IP 访问 localhost, 127.0.0.1 mysql>'; ...