一道典型的迷宫问题

小刚在迷宫内,他需要从A点出发,按顺序经过B,C,D……,到达最后一个点,再回到A点。迷宫内有些障碍,问至少走几步。

输入描述 Input Description

第一行有三个数n,m表示迷宫有n行,m列。

第2行到第n+1行,每行m个字符,可能是’A’..’Z’,’2’,’0’ 其中,2表示障碍,0表示可以走。’A’..’Z’也可以走。

输出描述 Output Description

至少走几步可以按规定走完,如果不行,输出“Impossible”

读完题后发现这道题比较吸引人的一点是在同一组数据中需要进行多次bfs,很有趣。

比较坑的地方在于,每一次需要判断是否能到达下一点,如果其中一个点到不了,那么便mission fail~

那么没什么问题啦,贴代码:

(写这道题的时候有点着急,以至于变量使用的有点乱QAQ)

#include<bits/stdc++.h>
using namespace std;
int ans,pre[],xz,yz,head,tail,n,m,flag;
int u[]={,-,,},p[]={,,,-};
int a[],b[],x[],y[];
bool map1[][],map2[][];
void pro(int num){
while(pre[num]){
++ans;
num=pre[num];
}
return ;
}
void doit(){
int i;
do{
head++;
for( i = ; i < ; ++i){
int xk=u[i]+a[head];
int yk=p[i]+b[head];
if(xk>=&&xk<=n&&yk>=&&yk<=m&&map2[xk][yk]){
tail++;
a[tail]=xk;b[tail]=yk;pre[tail]=head;
map2[xk][yk]=false;
if(xk==xz&&yk==yz){
flag=;
pro(tail);head=tail;
break;
}
}
}
}while(head<tail);
}
void start(){
int i,j;
flag=;
head=;tail=;
memset(pre,,sizeof(pre));
memset(a,,sizeof(a));
memset(b,,sizeof(b));
memset(map2,true,sizeof(map2));
for(i = ; i <= n ; ++i)
for(j = ; j <= m ; ++j)
map2[i][j]=map1[i][j]; }
int main(){
int j,sum=;
char s[];
memset(map1,true,sizeof(map1));
scanf("%d%d",&n,&m);
for(int i = ; i <= n ; ++i){
scanf("%s",s);
for( j = ; j <= m ; ++j){
if(s[j-]=='')map1[i][j]=false;
if(s[j-]>=){
x[s[j-]-]=i;
y[s[j-]-]=j;
sum++;
}
}
}
for(int i = ; i < sum ; ++i){
start();
xz=x[i+];yz=y[i+];
a[tail]=x[i];b[tail]=y[i];pre[tail]=;
map2[x[i]][y[i]]=false;
doit();
if(!flag){
printf("Impossible\n");
return ;
}
}
start();
xz=x[];yz=y[];
a[tail]=x[sum];b[tail]=y[sum];pre[tail]=;
map2[x[sum]][y[sum]]=false;
doit();
if(!flag){
printf("Impossible\n");
return ;
}
printf("%d\n",ans);
return ;
}

广搜:codevs-3344(初步bfs)的更多相关文章

  1. 双向广搜 codevs 3060 抓住那头奶牛

    codevs 3060 抓住那头奶牛 USACO  时间限制: 1 s  空间限制: 16000 KB  题目等级 : 黄金 Gold   题目描述 Description 农夫约翰被告知一头逃跑奶牛 ...

  2. 算法数据结构——数的深搜和广搜(dfs和bfs)

    leetcode104 二叉树的最大深度 https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/ 深度搜索分两种:递归(使用栈) ...

  3. 双向广搜+hash+康托展开 codevs 1225 八数码难题

    codevs 1225 八数码难题  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond   题目描述 Description Yours和zero在研究A*启 ...

  4. hdu 1242:Rescue(BFS广搜 + 优先队列)

    Rescue Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submis ...

  5. hdu 1195:Open the Lock(暴力BFS广搜)

    Open the Lock Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  6. 深搜(DFS)广搜(BFS)详解

    图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...

  7. poj3126 Prime Path 广搜bfs

    题目: The ministers of the cabinet were quite upset by the message from the Chief of Security stating ...

  8. 什么时候用深搜(dfs)什么时候用广搜(bfs)(转)

    1.BFS是用来搜索最短径路的解是比较合适的,比如求最少步数的解,最少交换次数的解,因为BFS搜索过程中遇到的解一定是离根最近的,所以遇到一个解,一定就是最优解,此时搜索算法可以终止.这个时候不适宜使 ...

  9. BFS广搜题目(转载)

    BFS广搜题目有时间一个个做下来 2009-12-29 15:09 1574人阅读 评论(1) 收藏 举报 图形graphc优化存储游戏 有时间要去做做这些题目,所以从他人空间copy过来了,谢谢那位 ...

随机推荐

  1. 生成一个唯一token

    $token = md5(uniqid(rand(), true));

  2. 12.js如何将明文转为MD5

    1.先下载MD5.JS 2.引入,使用hex_md5(str)即可

  3. 彩扩机项目--NPN和PNP三极管作为开关管的区别

    上图是最终画好的电路.使用的是NPN三极管,并且把NPN三极管放在了下面.下面分析下NPN三极管作为开关管能否放在上面. 从上面两张图分析可知,当三极管作为开关管使用的时候,NPN三极管需要放在下面( ...

  4. touchmover 手机端拖动方法

    function drag(obj, parentNode) { var obj = document.getElementById(obj); if (arguments.length == 1) ...

  5. ASP.NET Core 2.0 SignalR 示例

    # 一.前言 上次讲SignalR还是在<[在ASP.NET Core下使用SignalR技术](http://dotnet.ren/2017/02/21/%E5%9C%A8ASP-NET-Co ...

  6. accp8.0转换教材第8章JavaScript对象及初识面向对象理解与练习

    JavaScript数据类型,对象,构造函数,原型对象,初识原型链,对象继承 一.单词部分 ①object父类②constructor构造函数③instance实例④call调用 ⑤apply应用⑥c ...

  7. 如何使用slice,substr代替substring(原创)

    //写这个是为了加深对substring和slice的理解 substring: 任何一个参数小于0,都会被替换成0.两个参数,最小值会被当做start,最大值当做end. 参数 描述 start 必 ...

  8. document.querySelectorAll() 与document.getElementTagName() 的区别

    这个区别我估计大神都不知道,问题源于博主,细节被一个妹子发现的 事情经过是这样 <ul> <li>item</li> <li></li> & ...

  9. Mac之OS系统下搭建JavaEE环境 <一> 之JDK的安装配置

    这篇文章介绍了如何在Mac下搭建我们的JavaEE工作环境,对于初学者来说还是比较通俗易懂的. 一.JDK的安装及配置 1.首先我们到Oracle官网下JDK http://www.oracle.co ...

  10. MongoDB数据库索引

    前面的话 索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录.这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查 ...