ZOJ3865:Superbot(BFS) The 15th Zhejiang University Programming Contest
一个有几个小坑的bfs
题目很长,但并不复杂,大概总结起来有这么点。
有t组输入
每组输入n, m, p。表示一个n*m的地图,每p秒按键会右移一次(这个等会儿再讲)。
然后是地图的输入。其中'@'为起点,'$'为终点,'.'为通路,'*'为不通。
问从起点到终点最少需要多久?
一眼看去,裸的bfs嘛,10*10的地图,简单!
不过还是连错4次……
注意!
每一秒有4种操作,注意,不是三种,1. 光标左移,2. 光标右移,3. 按照光标方向行走,4. 不动(尤其是这一个)。
所谓光标左移,右移,因为题目中给出了光标(在图上,共4个方向),每次改变的移动方向只能是当前光标选择的方向的左右两个。而行走只能按照光标所指的方向。
另外每过p秒,方向会变化(初始四个方向的顺序为左右上下,p秒后变成右上下左,再过p秒后变为上下左右)。
废话说完,上代码——
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <queue>
- using namespace std;
- const int N = ;
- struct node
- {
- int x, y, dis, step;
- };
- int go[][] = {{, -}, {, }, {-, }, {, }};
- int t;
- int n, m, P;
- char mp[N][N];
- bool v[N][N];
- bool vv[N][N][];
- int change(int a)
- {
- switch(a)
- {
- case :
- return ;
- case :
- return ;
- case :
- return ;
- case :
- return ;
- }
- }
- void bfs()
- {
- node p;
- bool k = ;
- for(int i = ; i < n; i++)
- {
- for(int j = ; j < m; j++)
- {
- if(mp[i][j] == '@')
- {
- p.x = i;
- p.y = j;
- k = ; break;
- }
- }
- if(k) break;
- }
- p.dis = ;
- p.step = ;
- vv[p.x][p.y][] = ;
- queue<node> que;
- que.push(p);
- while(!que.empty())
- {
- node p = que.front();
- que.pop();
- int xx = p.x+go[p.dis][];
- int yy = p.y+go[p.dis][];
- if(xx >= && xx < n && yy >= && yy < m)
- {
- if(v[xx][yy] == )
- {
- if(mp[xx][yy] == '.')
- {
- v[xx][yy] = ;
- node q;
- q.x = xx;
- q.y = yy;
- q.step = p.step+;
- q.dis = p.dis;
- if(q.step%P == )
- {
- q.dis = change(q.dis);
- vv[xx][yy][q.dis] = ;
- }
- que.push(q);
- }
- else if(mp[xx][yy] == '$')
- {
- printf("%d\n", p.step+);
- return;
- }
- }
- }
- if((p.step+)%P == ) {p.dis = change(p.dis);}
- node q;
- q.x = p.x;
- q.y = p.y;
- q.step = p.step+;
- q.dis = p.dis+;
- q.dis %= ;
- if(vv[q.x][q.y][q.dis] == )
- {
- que.push(q);
- vv[q.x][q.y][q.dis] = ;
- }
- q.dis = p.dis+;
- q.dis %= ;
- if(vv[q.x][q.y][q.dis] == )
- {
- que.push(q);
- vv[q.x][q.y][q.dis] = ;
- }
- q.dis = p.dis;
- if(vv[q.x][q.y][q.dis] == )
- {
- que.push(q);
- vv[q.x][q.y][q.dis] = ;
- }
- }
- printf("YouBadbad\n");
- }
- int main()
- {
- //freopen("test.txt", "r", stdin);
- scanf("%d", &t);
- while(t--)
- {
- memset(mp, , sizeof(mp));
- memset(v, , sizeof(v));
- memset(vv, , sizeof(vv));
- scanf("%d%d%d", &n, &m, &P);
- for(int i = ; i < n; i++)
- {
- scanf("%s", mp[i]);
- }
- bfs();
- }
- }
ZOJ3865:Superbot(BFS) The 15th Zhejiang University Programming Contest的更多相关文章
- The 15th Zhejiang University Programming Contest
a ZOJ 3860 求和大家不一样的那个数,签到,map水之 #include<cstdio> #include<map> using namespace std; map ...
- zoj 4020 The 18th Zhejiang University Programming Contest Sponsored by TuSimple - G Traffic Light(广搜)
题目链接:The 18th Zhejiang University Programming Contest Sponsored by TuSimple - G Traffic Light 题解: 题意 ...
- The 16th Zhejiang University Programming Contest-
Handshakes Time Limit: 2 Seconds Memory Limit: 65536 KB Last week, n students participated in t ...
- 152 - - G Traffic Light 搜索(The 18th Zhejiang University Programming Contest Sponsored by TuSimple )
http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5738 题意 给你一个map 每个格子里有一个红绿灯,用0,1表示 ...
- The 19th Zhejiang University Programming Contest - H
Princess Cjb is caught by Heltion again! Her knights Little Sub and Little Potato are going to Helti ...
- The 19th Zhejiang University Programming Contest Sponsored by TuSimple (Mirror) B"Even Number Theory"(找规律???)
传送门 题意: 给出了三个新定义: E-prime : ∀ num ∈ E,不存在两个偶数a,b,使得 num=a*b;(简言之,num的一对因子不能全为偶数) E-prime factorizati ...
- The 19th Zhejiang University Programming Contest Sponsored by TuSimple (Mirror)
http://acm.zju.edu.cn/onlinejudge/showContestProblems.do?contestId=391 A Thanks, TuSimple! Time ...
- 2019 The 19th Zhejiang University Programming Contest
感想: 今天三个人的状态比昨天计院校赛的状态要好很多,然而三个人都慢热体质导致签到题wa了很多发.最后虽然跟大家题数一样(6题),然而输在罚时. 只能说,水题还是刷得少,看到签到都没灵感实在不应该. ...
- Mergeable Stack 直接list内置函数。(152 - The 18th Zhejiang University Programming Contest Sponsored by TuSimple)
题意:模拟栈,正常pop,push,多一个merge A B 形象地说就是就是将栈B堆到栈A上. 题解:直接用list 的pop_back,push_back,splice 模拟, 坑:用splice ...
随机推荐
- POJ 1258 Agri-Net(最小生成树,基础)
题目 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<math ...
- 【好玩的应用】QQ连连看辅助工具
自己学了这么久的C语言,但没有写出过什么可以用的东西来,总觉得心里不爽.这几天实在是不想干正事,在网上瞎逛逛,结果发现有人写了连连看的外挂.顿时觉得这很有意思啊.于是把代码下载下来,捣鼓了捣鼓.发现还 ...
- crontab定时运行git命令 更新代码库
Q: http://stackoverflow.com/questions/7994663/git-push-via-cron I'm trying to run a git push fro ...
- POJ 1691 Painting A Board(DFS)
链接 题意 : 看了好长时间终于看懂题目了,将一个大矩形划分成若干小矩形,告诉你每个小矩形的左上角那个点和右下角那个点的坐标,告诉你这个小矩形要涂的颜色,每个颜色对应一个刷子,问你最少要使用几次刷子. ...
- hdu 4704 Sum
思路:对于给定的n,s(i)即将n分解为i个数的组合数,也就是在n-1个位置插入i-1个板即C(n-1,i-1); ∑S=2^(n-1); phi(1000000007)=1000000006; 对于 ...
- Oracle 9 - redo和undo
1.redo redo 有在线redo日志和归档redo日志, 从Oracle 10g开始还新增加了flashback技术. 每个Oracle数据库至少有2个在线重做日志组,循环写. 只有INSERT ...
- ORA-04052\ ORA-00604\ORA-12154
ORA-04052: error occurred when looking up remote object TBCS.SUBS_PRIVILEGE@DD2A ORA-00604: error oc ...
- java生成二维码的三个工具
1. 使用SwetakeQRCode在Java项目中生成二维码 http://swetake.com/qr/ 下载地址 或着http://sourceforge.jp/projects/qrcode ...
- Java实现二维码QRCode的编码和解码
涉及到的一些主要类库,方便大家下载: 编码lib:Qrcode_swetake.jar (官网介绍-- http://www.swetake.com/qr/index-e.html) 解码lib: ...
- lintcode:合并两个排序链表
题目: 合并两个排序链表 将两个排序链表合并为一个新的排序链表 样例 给出 1->3->8->11->15->null,2->null, 返回 1->2-& ...