哈理工OJ 2074 逃生(广搜题目)
来源:互联网 发布:北京软件测试培训班 编辑:程序博客网 时间:2024/04/29 10:06
逃生
Time Limit: 1000 MS Memory Limit: 65536 K
Total Submit: 94(28 users) Total Accepted: 24(20 users) Rating: Special Judge: No
Description
小A沦落到了一个迷宫之中,这个迷宫由n*m个格子构成,有些格子是不能通过的,现在他要从迷宫入口(1,1)的格子走到迷宫出口(n,m)的格子。
因为小A的方向感很弱,转多了会晕,所以他走到目的地的时候,最多能转z次,否则他就永远晕倒在原地了,到了出口也没法出去了。
请你告诉他最少能经过多少个格子走出迷宫。
小Y从(1,1)出发到达的第一个点都可以认为不用转向。
Input
有多组测试数据。
对于每组测试数据,第一行为3个整数n, m和z,表示n*m的迷宫,最多能转z次。
接下来是n*m的字符矩阵,仅由0和1表示,0表示可以通过,1表示不可以通过。
(2<=n,m<=100 ,1<=z<=50)
Output
对于每组测试数据,输出一行,包含一个整数,为经过的最少格子数。如果无法到达目的地,输出-1。
Sample Input
2 3 3
011
000
3 2 3
01
11
00
5 5 3
00000
00000
00101
01000
00000
Sample Output
4
-1
9
Source
“科林明伦杯”哈尔滨理工大学第四届ACM程序设计竞赛(预选赛)
本题的大致思路,向某个方向开始走后,一直走到底,跟不撞南墙不回头有点相似,以前做过一个杭电的题目HDU 1728逃离迷宫,这个题跟那个题差不多。选定了一个方向,走到这个方向可以走到的最后一个点那里。然后在走的过程中不断的将点压入队列,走到每一个点所用的步数是前一个点所用的步数加一。
下面是AC代码:
#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;struct node{ int x,y,step,time;};int n,m,t;int dir[4][2]= {{0,1},{0,-1},{-1,0},{1,0}};char a[105][105];int book[105][105];int bfs(int x0,int y0,int x1,int y1){ queue<node>q; node fr,ne,fr1; fr.x=x0,fr.y=y0,fr.step=0,fr.time=-1;//因为一开始走不算转向,所以初始化第一个点的转向次数为-1 q.push(fr); while(!q.empty()) { fr=q.front(); q.pop(); for(int i=0; i<4; i++) { ne.x=fr.x+dir[i][0]; ne.y=fr.y+dir[i][1]; ne.step=fr.step+1; ne.time=fr.time+1; while(ne.x>=0&&ne.x<n&&ne.y>=0&&ne.y<m&&book[ne.x][ne.y]==0)//朝一个方向搜到底 { if(book[ne.x][ne.y]==0)//某一个点还没有走过。。 { book[ne.x][ne.y]=1; if(fr.time+1<=t&&ne.x==x1&&ne.y==y1) return ne.step+1; q.push(ne); } ne.x=ne.x+dir[i][0]; ne.y=ne.y+dir[i][1]; ne.step+=1; } } } return -1;}int main(){ while(~scanf("%d%d%d",&n,&m,&t)) { memset(book,0,sizeof(book)); for(int i=0; i<n; i++) { scanf("%s",&a[i]); for(int j=0; j<m; j++) { if(a[i][j]=='1') { book[i][j]=1;//该点不可走的话标记为1 } } } int re=bfs(0,0,n-1,m-1);//从第一个点走到最后一个点是不是可以实现 printf("%d\n",re); } return 0;}
- 哈理工OJ 2074 逃生(广搜题目)
- HLG 哈理工OJ 2074逃生
- 哈理工OJ 2147 经理办公室(深搜题目)
- 哈理工OJ 1621迷宫问题II(优先队列广搜)
- 哈理工OJ 2161 数列(数学题目)
- 哈理工OJ 2291 Help C5(分形题目)
- hrbust 1214 哈理工oj 1214 方格取数【BFS广搜+dp】
- 哈理工OJ 1909 理工门外的树(思维题目)
- 哈理工OJ 2281 11(简单的找规律题目)
- 哈理工OJ 2248 开锁魔法1(简单的思维题目)
- 哈理工OJ 1151 追求(斐波那契变形【思维题目】)
- 哈理工OJ 2255 镇守府海域·镇守府近海(模拟题目)
- 取石子(一) (南阳理工oj 题目23)
- 括号配对问题 (南阳理工oj-题目2)
- 一种排序 (南阳理工oj 题目8)
- Registration system (南阳理工oj 题目991)
- 01串 (南阳理工oj 题目252)
- 子串和(南阳理工oj-题目44)
- 然而沼跃鱼早已看穿了一切——字符串替换
- php获取系统信息
- 文本分类随笔
- webview添加头尾视图
- Json方法封装
- 哈理工OJ 2074 逃生(广搜题目)
- Android 百分比布局库(percent-support-lib) 解析与扩展
- android打包
- Android-ImageView
- Android获取栈顶程序
- 6.2.7 QMGR_PEER:跨域组织QMGR_JOB
- 高仿探探/QQ巧遇手势滑动选项卡切换源码
- zz:安卓测试工具Monkey的使用方法
- 图片下拉缩放效果