广搜:codevs-3344(初步bfs)
一道典型的迷宫问题
小刚在迷宫内,他需要从A点出发,按顺序经过B,C,D……,到达最后一个点,再回到A点。迷宫内有些障碍,问至少走几步。
第一行有三个数n,m表示迷宫有n行,m列。
第2行到第n+1行,每行m个字符,可能是’A’..’Z’,’2’,’0’ 其中,2表示障碍,0表示可以走。’A’..’Z’也可以走。
至少走几步可以按规定走完,如果不行,输出“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)的更多相关文章
- 双向广搜 codevs 3060 抓住那头奶牛
codevs 3060 抓住那头奶牛 USACO 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题目描述 Description 农夫约翰被告知一头逃跑奶牛 ...
- 算法数据结构——数的深搜和广搜(dfs和bfs)
leetcode104 二叉树的最大深度 https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/ 深度搜索分两种:递归(使用栈) ...
- 双向广搜+hash+康托展开 codevs 1225 八数码难题
codevs 1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Yours和zero在研究A*启 ...
- hdu 1242:Rescue(BFS广搜 + 优先队列)
Rescue Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submis ...
- hdu 1195:Open the Lock(暴力BFS广搜)
Open the Lock Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- 深搜(DFS)广搜(BFS)详解
图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...
- poj3126 Prime Path 广搜bfs
题目: The ministers of the cabinet were quite upset by the message from the Chief of Security stating ...
- 什么时候用深搜(dfs)什么时候用广搜(bfs)(转)
1.BFS是用来搜索最短径路的解是比较合适的,比如求最少步数的解,最少交换次数的解,因为BFS搜索过程中遇到的解一定是离根最近的,所以遇到一个解,一定就是最优解,此时搜索算法可以终止.这个时候不适宜使 ...
- BFS广搜题目(转载)
BFS广搜题目有时间一个个做下来 2009-12-29 15:09 1574人阅读 评论(1) 收藏 举报 图形graphc优化存储游戏 有时间要去做做这些题目,所以从他人空间copy过来了,谢谢那位 ...
随机推荐
- postcss使用
准备 构建工具为Gulp基于PostCSSPostCSS插件 CSSNext 用下一代CSS书写方式兼容现在浏览器PostCSS插件 Autoprefixer 为CSS补全浏览器前缀PostCSS插件 ...
- CentOS7.2上用KVM安装虚拟机window10踩过的坑
最近两个星期一直在琢磨kvm安装window10操作系统,并且通过桥接模式与外界通信,经历了九九八十一难,终于搞定.下面就记录以下我们在探索的过程中踩过的坑. 安装KVM 1. 系统要求:需要一台可以 ...
- Linux文件属性上
文件属性概述(ls -lhi) linux里一切皆文件Linux系统中的文件或目录的属性主要包括:索引节点(inode),文件类型,权限属性,链接数,所归属的用户和用户组,最近修改时间等内容: 解释: ...
- JavaScript 语言基础
js语言基础 一 基本知识 UniCode编码 区分大小写(HTML不区分/XHTML区分) Unicode转义序列 \uxxxx (\u加4位16进制表示) 注释 单行注释:// 多行注释:/* * ...
- UGUI 字体背景长度自适应
本文实现以下需求: 在UGUI中 Text为动态添加 要使Text字体背景随着Text的长度而变化 之前还在赞叹UGUI的强大 转念一想,UGUI中好像没有可以实现此功能的组件 也想出了一种办法 把背 ...
- User implements HttpSessionBindingListener
public class User implements HttpSessionBindingListener { private int id; private String userName; p ...
- 网络流入门—用于最大流的Dinic算法
"网络流博大精深"-sideman语 一个基本的网络流问题 最早知道网络流的内容便是最大流问题,最大流问题很好理解: 解释一定要通俗! 如右图所示,有一个管道系统,节点{1,2,3 ...
- Android反编译odex然后重新打包
#Android反编译odex然后重新打包 最近不知道怎么回事,突然把我那刷了氧OS的root了,然后就开始好奇起来氢OS所带有的那些本地化的东西,比如通话录音就是典型的一个之一.其中也做了很多的尝试 ...
- JavaScript一个生成文档目录的实例
执行结果: <body> <script type="text/javascript"> /** * 这个模块注册一个可在页面加载完成后自动运行的匿名函数, ...
- java在控制台输出空心正方形,菱形,空心菱形
使用for和if打印一个空心正方形 /*思路:要想打印一个5x5的空心正方形,首先它的第一横行和最后一行都是填满的,需要全部遍历出来,第二三四行和只有左右两条边是出来的,中间部分为空的.因此在打印第 ...