Hrbust-1942-this is bad problom(搜索)
2017-06-02 20:15
183 查看
this is bad problom
Time Limit: 1000 MS Memory Limit: 32768 K
Total Submit: 273(61 users) Total Accepted: 69(60 users) Rating: Special Judge: No
Description
周末了,小辉在大街上无聊地压马路,突然他想去找女童鞋一起快乐地玩耍,但是他有个毛病就是讨厌走路,他现在想知道到每个女童鞋那里的最少步数,再决定找哪个女童鞋。
首先给出小辉和女童鞋所在的N*N平面图,如图为6*6平面图。
….#.
.*.#..
……
######
……
……
有Q个女童鞋,每个女童鞋所在的地点用坐标表示,左上角处坐标为(0,0)。
图中’*’代表小辉所在的位置,即(1,1),’.’代表空地,’#’代表不能直接通过的建筑物。
小辉将去找他所能到达的并且离他步数最少的那个女童鞋。
女童鞋的位置可能在除建筑物的任意位置上。
Input
有多组测试数据,处理到文件结束。
对于每组测试数据,第一行是两个整数N(2<=N<=100),Q(1<=Q<=1000),分别代表地区的边长和女童鞋的个数.
接下来输入n*n平面图,代表地区平面图。
然后Q行,每行一个坐标代表女童鞋所在位置。
Output
输出小辉到那个女童鞋的步数,如果没有满足条件的女童鞋,则输出cry,最后换行.
Sample Input
6 3
… . # .
. * . # . .
… …
######
… …
… …
0 0
1 4
5 3
3 2
* . .
###
…
2 0
2 1
Sample Output
2
cry
Time Limit: 1000 MS Memory Limit: 32768 K
Total Submit: 273(61 users) Total Accepted: 69(60 users) Rating: Special Judge: No
Description
周末了,小辉在大街上无聊地压马路,突然他想去找女童鞋一起快乐地玩耍,但是他有个毛病就是讨厌走路,他现在想知道到每个女童鞋那里的最少步数,再决定找哪个女童鞋。
首先给出小辉和女童鞋所在的N*N平面图,如图为6*6平面图。
….#.
.*.#..
……
######
……
……
有Q个女童鞋,每个女童鞋所在的地点用坐标表示,左上角处坐标为(0,0)。
图中’*’代表小辉所在的位置,即(1,1),’.’代表空地,’#’代表不能直接通过的建筑物。
小辉将去找他所能到达的并且离他步数最少的那个女童鞋。
女童鞋的位置可能在除建筑物的任意位置上。
Input
有多组测试数据,处理到文件结束。
对于每组测试数据,第一行是两个整数N(2<=N<=100),Q(1<=Q<=1000),分别代表地区的边长和女童鞋的个数.
接下来输入n*n平面图,代表地区平面图。
然后Q行,每行一个坐标代表女童鞋所在位置。
Output
输出小辉到那个女童鞋的步数,如果没有满足条件的女童鞋,则输出cry,最后换行.
Sample Input
6 3
… . # .
. * . # . .
… …
######
… …
… …
0 0
1 4
5 3
3 2
* . .
###
…
2 0
2 1
Sample Output
2
cry
#include<stdio.h>///深搜,其实用到了队列我感觉是是广搜 #include<queue> #include<string.h> using namespace std; struct location///行走坐标和步数打包结构体 { int x,y,step; }now,nexts; char maps[109][109];///输入n*n阵字符串,相当于地图 bool vis[109][109];///标记数组,检查是否走过某个坐标 int walkx[4]={0,1,0,-1};///行走数组,四个方向迈进 int walky[4]={1,0,-1,0}; int i,j,n,q,hx,hy; int dfs(int x,int y)///搜索函数 { memset(vis,false,sizeof(vis));///清空标记数组 queue<location>s;///建立结构体location型队列 now.x=x;now.y=y;///now结构体存放当时使用的坐标和步数 now.step=0; vis[x][y]=true;///小辉所在坐标要标记,不能返回这里 s.push(now);///讲初始坐标塞入队列 while(!s.empty())///当队列不为空 { now=s.front();///取出队首 s.pop();///把取出的弹出去 if(maps[now.x][now.y]=='G')///先检查取出来的这个坐标是否有女孩子 { return now.step;///有的话可以返回步数了,这里题目要求的是最小步数,因为每次执行行走循环,都是只行走一步的,所以,最小步数就是最快找到女孩子的路线,会最先退出搜索循环 }///同时因为题目所求是最小步数,即使有相同的最小步数也不会影响 for(int i=0;i<4;i++)///四步走 { nexts.x=now.x+walkx[i];///next结构体存放下一个将要到达的坐标 nexts.y=now.y+walky[i]; nexts.step=now.step+1;///步数记得加1 if(nexts.x<n&&nexts.x>=0&&nexts.y<n&&nexts.y>=0&&maps[nexts.x][nexts.y]!='#'&&vis[nexts.x][nexts.y]==false)///检查的条件有: {///坐标不能超出地图,坐标到达的是为走过的路线,坐标不能走建筑物 vis[nexts.x][nexts.y]=true;///如果符合条件则标记这个可以走的坐标,代表走过 s.push(nexts);///并塞入队列中,表示从这里继续探索往四个方向走下去 } } } return -1;///如果到了这一步,说明上面所有步骤都走完了,队列空了,每个地方都走过了也没有找到女孩子,只能cry了,返回-1 } int main() { while(scanf("%d%d",&n,&q)!=EOF)///输入n*n矩阵,以及q个女孩子 { for(i=0;i<n;i++)///输入部分 { scanf("%s",maps[i]); for(j=0;j<n;j++) { if(maps[i][j]=='*')///输入时即可查找*小辉坐标,找到并记录下坐标 { hx=i; hy=j; } } } int gx,gy;///女孩子的坐标 while(q--)///有q个女孩子就标记q次,输入q次 { scanf("%d%d",&gx,&gy); maps[gx][gy]='G';///讲坐标带入map中,直接标记为一个字符,比较好查找 } int flag=dfs(hx,hy);///进入搜索,初始值,开始寻找的坐标就是小辉的坐标 if(flag!=-1)///检查返回值 { printf("%d\n",flag); } else { printf("cry\n"); } } return 0; }
相关文章推荐
- 哈理工OJ 1942 this is bad problom(搜索BFS)
- 【BFS】HRBUST 1942 this is bad problom
- hrbust 1942this is bad problom 【基础bfs】
- hrbust 移动(宽度优先搜索)
- hrbust 2162 哈理工oj 2162 【分形图、搜索】
- hrbust 1525 水神【纪念搜索题解100篇】【Bfs】
- 搜索
- 百度搜索结果页面的参数_输入耗时(inputT)
- UVA 10603 FILL 隐式图搜索
- JavaScript让登录或搜索文本框自动获得焦点
- solr搜索之demo和集成IKAnalyzer(二)
- (5)恶意代码的亲密接触之文件搜索和API导址
- DEDE搜索结果按点击排序的方法
- 搜索总结c++ 内存泄露问题
- hiho-102周 搜索五·数独
- 微信小程序--搜索电影app(续)
- Erlang shell添加搜索路径
- jQuery 插件 仿百度搜索框智能提示 调用简单!
- Intellij IDEA 搜索文件内容
- 使用 Sphinx 更好地进行 MySQL 搜索