一个有几个小坑的bfs

题目很长,但并不复杂,大概总结起来有这么点。

有t组输入

每组输入n, m, p。表示一个n*m的地图,每p秒按键会右移一次(这个等会儿再讲)。

然后是地图的输入。其中'@'为起点,'$'为终点,'.'为通路,'*'为不通。

问从起点到终点最少需要多久?

一眼看去,裸的bfs嘛,10*10的地图,简单!

不过还是连错4次……

注意!

每一秒有4种操作,注意,不是三种,1. 光标左移,2. 光标右移,3. 按照光标方向行走,4. 不动(尤其是这一个)。

所谓光标左移,右移,因为题目中给出了光标(在图上,共4个方向),每次改变的移动方向只能是当前光标选择的方向的左右两个。而行走只能按照光标所指的方向。

另外每过p秒,方向会变化(初始四个方向的顺序为左右上下,p秒后变成右上下左,再过p秒后变为上下左右)。

废话说完,上代码——

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <queue>
  6. using namespace std;
  7.  
  8. const int N = ;
  9.  
  10. struct node
  11. {
  12. int x, y, dis, step;
  13. };
  14.  
  15. int go[][] = {{, -}, {, }, {-, }, {, }};
  16.  
  17. int t;
  18. int n, m, P;
  19. char mp[N][N];
  20. bool v[N][N];
  21. bool vv[N][N][];
  22.  
  23. int change(int a)
  24. {
  25. switch(a)
  26. {
  27. case :
  28. return ;
  29. case :
  30. return ;
  31. case :
  32. return ;
  33. case :
  34. return ;
  35. }
  36. }
  37.  
  38. void bfs()
  39. {
  40. node p;
  41. bool k = ;
  42. for(int i = ; i < n; i++)
  43. {
  44. for(int j = ; j < m; j++)
  45. {
  46. if(mp[i][j] == '@')
  47. {
  48. p.x = i;
  49. p.y = j;
  50. k = ; break;
  51. }
  52. }
  53. if(k) break;
  54. }
  55. p.dis = ;
  56. p.step = ;
  57. vv[p.x][p.y][] = ;
  58.  
  59. queue<node> que;
  60. que.push(p);
  61. while(!que.empty())
  62. {
  63. node p = que.front();
  64. que.pop();
  65.  
  66. int xx = p.x+go[p.dis][];
  67. int yy = p.y+go[p.dis][];
  68. if(xx >= && xx < n && yy >= && yy < m)
  69. {
  70. if(v[xx][yy] == )
  71. {
  72. if(mp[xx][yy] == '.')
  73. {
  74. v[xx][yy] = ;
  75. node q;
  76. q.x = xx;
  77. q.y = yy;
  78. q.step = p.step+;
  79. q.dis = p.dis;
  80. if(q.step%P == )
  81. {
  82. q.dis = change(q.dis);
  83. vv[xx][yy][q.dis] = ;
  84. }
  85. que.push(q);
  86. }
  87. else if(mp[xx][yy] == '$')
  88. {
  89. printf("%d\n", p.step+);
  90. return;
  91. }
  92. }
  93. }
  94.  
  95. if((p.step+)%P == ) {p.dis = change(p.dis);}
  96.  
  97. node q;
  98. q.x = p.x;
  99. q.y = p.y;
  100. q.step = p.step+;
  101.  
  102. q.dis = p.dis+;
  103. q.dis %= ;
  104. if(vv[q.x][q.y][q.dis] == )
  105. {
  106. que.push(q);
  107. vv[q.x][q.y][q.dis] = ;
  108. }
  109.  
  110. q.dis = p.dis+;
  111. q.dis %= ;
  112. if(vv[q.x][q.y][q.dis] == )
  113. {
  114. que.push(q);
  115. vv[q.x][q.y][q.dis] = ;
  116. }
  117.  
  118. q.dis = p.dis;
  119. if(vv[q.x][q.y][q.dis] == )
  120. {
  121. que.push(q);
  122. vv[q.x][q.y][q.dis] = ;
  123. }
  124. }
  125. printf("YouBadbad\n");
  126. }
  127.  
  128. int main()
  129. {
  130. //freopen("test.txt", "r", stdin);
  131. scanf("%d", &t);
  132. while(t--)
  133. {
  134. memset(mp, , sizeof(mp));
  135. memset(v, , sizeof(v));
  136. memset(vv, , sizeof(vv));
  137. scanf("%d%d%d", &n, &m, &P);
  138. for(int i = ; i < n; i++)
  139. {
  140. scanf("%s", mp[i]);
  141. }
  142. bfs();
  143. }
  144. }

ZOJ3865:Superbot(BFS) The 15th Zhejiang University Programming Contest的更多相关文章

  1. The 15th Zhejiang University Programming Contest

    a  ZOJ 3860 求和大家不一样的那个数,签到,map水之 #include<cstdio> #include<map> using namespace std; map ...

  2. 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 题解: 题意 ...

  3. The 16th Zhejiang University Programming Contest-

    Handshakes Time Limit: 2 Seconds      Memory Limit: 65536 KB Last week, n students participated in t ...

  4. 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表示 ...

  5. 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 ...

  6. 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 ...

  7. The 19th Zhejiang University Programming Contest Sponsored by TuSimple (Mirror)

    http://acm.zju.edu.cn/onlinejudge/showContestProblems.do?contestId=391 A     Thanks, TuSimple! Time ...

  8. 2019 The 19th Zhejiang University Programming Contest

    感想: 今天三个人的状态比昨天计院校赛的状态要好很多,然而三个人都慢热体质导致签到题wa了很多发.最后虽然跟大家题数一样(6题),然而输在罚时. 只能说,水题还是刷得少,看到签到都没灵感实在不应该. ...

  9. 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 ...

随机推荐

  1. POJ 1258 Agri-Net(最小生成树,基础)

    题目 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<math ...

  2. 【好玩的应用】QQ连连看辅助工具

    自己学了这么久的C语言,但没有写出过什么可以用的东西来,总觉得心里不爽.这几天实在是不想干正事,在网上瞎逛逛,结果发现有人写了连连看的外挂.顿时觉得这很有意思啊.于是把代码下载下来,捣鼓了捣鼓.发现还 ...

  3. crontab定时运行git命令 更新代码库

    Q:  http://stackoverflow.com/questions/7994663/git-push-via-cron    I'm trying to run a git push fro ...

  4. POJ 1691 Painting A Board(DFS)

    链接 题意 : 看了好长时间终于看懂题目了,将一个大矩形划分成若干小矩形,告诉你每个小矩形的左上角那个点和右下角那个点的坐标,告诉你这个小矩形要涂的颜色,每个颜色对应一个刷子,问你最少要使用几次刷子. ...

  5. hdu 4704 Sum

    思路:对于给定的n,s(i)即将n分解为i个数的组合数,也就是在n-1个位置插入i-1个板即C(n-1,i-1); ∑S=2^(n-1); phi(1000000007)=1000000006; 对于 ...

  6. Oracle 9 - redo和undo

    1.redo redo 有在线redo日志和归档redo日志, 从Oracle 10g开始还新增加了flashback技术. 每个Oracle数据库至少有2个在线重做日志组,循环写. 只有INSERT ...

  7. ORA-04052\ ORA-00604\ORA-12154

    ORA-04052: error occurred when looking up remote object TBCS.SUBS_PRIVILEGE@DD2A ORA-00604: error oc ...

  8. java生成二维码的三个工具

    1.  使用SwetakeQRCode在Java项目中生成二维码 http://swetake.com/qr/ 下载地址 或着http://sourceforge.jp/projects/qrcode ...

  9. Java实现二维码QRCode的编码和解码

    涉及到的一些主要类库,方便大家下载: 编码lib:Qrcode_swetake.jar   (官网介绍-- http://www.swetake.com/qr/index-e.html) 解码lib: ...

  10. lintcode:合并两个排序链表

    题目: 合并两个排序链表 将两个排序链表合并为一个新的排序链表  样例 给出 1->3->8->11->15->null,2->null, 返回 1->2-& ...