当时看了这题就感觉so easy。。。  本来不想写的,后来感觉是不是可以练一下搜索水平。。

比赛时有人过了就没写。       比赛完了写一下。

实现还不是那么顺利,  囧

本来自己以为这题能练下搜索,其实DFS、BFS都没用到,也许模拟中有点搜索吧。

还是类似方格的东西把外围也设置成未标记要好的多,做题多了也许就有这种感觉了吧。

还有自己忽略了驴 老虎前面是已经走过的路也可以转弯。   BS!!

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <vector>
  5. #include <algorithm>
  6.  
  7. #define clr(x) memset(x, 0, sizeof(x))
  8.  
  9. using namespace std;
  10.  
  11. const int maxn = 1200;
  12. int dv[maxn][maxn], tv[maxn][maxn];
  13. int n, temp;
  14.  
  15. //碰到已经走过的点也会转向 不仅是撞墙时。
  16.  
  17. int main()
  18. {
  19. while(scanf("%d", &n) != EOF)
  20. {
  21. if(!n) break;
  22. memset(dv, -1, sizeof(dv));
  23. memset(tv, -1, sizeof(tv));
  24. int a2, b2, c2, a1, b1, c1, ans;
  25. scanf("%d%d%d",&a1, &b1, &c1);
  26. a1++; b1++;
  27. scanf("%d%d%d",&a2, &b2, &c2);
  28. a2++; b2++;
  29. ans = 0;
  30.  
  31. for(int i = 1; i <= n; i++) //防止界外。 外围都要包一层
  32. for(int j = 1; j <= n; j++)
  33. {
  34. dv[i][j] = 0;
  35. tv[i][j] = 0;
  36. }
  37.  
  38. dv[a1][b1] = 1; tv[a2][b2] = 1;
  39.  
  40. while(true)
  41. {
  42. int ok1 = 0, ok2 = 0, temp;
  43.  
  44. if(a1 == a2 && b1 == b2) break;
  45.  
  46. if(c1 == 0) // east
  47. {
  48. temp = b1 + 1;
  49. if(!dv[a1][temp])
  50. {
  51. ++b1;
  52. ok1 = 1;
  53. dv[a1][temp] = 1;
  54. }
  55. else if(!dv[a1+1][b1])
  56. {
  57. ++a1;
  58. ok1 = 1;
  59. c1 = 1;
  60. dv[a1][b1] = 1;
  61. }
  62. }
  63. else if(c1 == 1) //south
  64. {
  65. temp = a1 + 1;
  66. if(!dv[temp][b1])
  67. {
  68. ++a1;
  69. ok1 = 1;
  70. dv[temp][b1] = 1;
  71. }
  72. else if(!dv[a1][b1-1])
  73. {
  74. --b1;
  75. ok1 = 1;
  76. c1 = 2;
  77. dv[a1][b1] = 1;
  78. }
  79. }
  80. else if(c1 == 2) //west
  81. {
  82. temp = b1 - 1;
  83. if(!dv[a1][temp])
  84. {
  85. --b1;
  86. ok1 = 1;
  87. dv[a1][temp] = 1;
  88. }
  89. else if(!dv[a1-1][b1])
  90. {
  91. --a1;
  92. ok1 = 1;
  93. c1 = 3;
  94. dv[a1][b1] = 1;
  95. }
  96. }
  97. else if(c1 == 3) //north
  98. {
  99. temp = a1 - 1;
  100. if(!dv[temp][b1])
  101. {
  102. --a1;
  103. ok1 = 1;
  104. dv[temp][b1] = 1;
  105. }
  106. else if(!dv[a1][b1+1])
  107. {
  108. ++b1;
  109. ok1 = 1;
  110. c1 = 0;
  111. dv[a1][b1] = 1;
  112. }
  113. }
  114.  
  115. if(c2 == 0) // east
  116. {
  117. temp = b2 + 1;
  118. if(!tv[a2][temp])
  119. {
  120. ++b2;
  121. ok2 = 1;
  122. tv[a2][temp] = 1;
  123. }
  124. else if(!tv[a2-1][b2])
  125. {
  126. --a2;
  127. ok2 = 1;
  128. c2 = 3;
  129. tv[a2][b2] = 1;
  130. }
  131. }
  132. else if(c2 == 1) //south
  133. {
  134. temp = a2 + 1;
  135. if(!tv[temp][b2])
  136. {
  137. ++a2;
  138. ok2 = 1;
  139. tv[temp][b2] = 1;
  140. }
  141. else if(!tv[a2][b2+1])
  142. {
  143. ++b2;
  144. ok2 = 1;
  145. c2 = 0;
  146. tv[a2][b2] = 1;
  147. }
  148. }
  149. else if(c2 == 2) //west
  150. {
  151. temp = b2 - 1;
  152. if(!tv[a2][temp])
  153. {
  154. --b2;
  155. ok2 = 1;
  156. tv[a2][temp] = 1;
  157. }
  158. else if(!tv[a2+1][b2])
  159. {
  160. ++a2;
  161. ok2 = 1;
  162. c2 = 1;
  163. tv[a2][b2] = 1;
  164. }
  165. }
  166. else if(c2 == 3) //north
  167. {
  168. temp = a2 - 1;
  169. if(!tv[temp][b2])
  170. {
  171. --a2;
  172. ok2 = 1;
  173. tv[temp][b2] = 1;
  174. }
  175. else if(!tv[a2][b2-1])
  176. {
  177. --b2;
  178. ok2 = 1;
  179. c2 = 2;
  180. tv[a2][b2] = 1;
  181. }
  182. }
  183.  
  184. if(ok1 == 0 && ok2 == 0)
  185. {
  186. ans = -1; break;
  187. }
  188. }
  189.  
  190. if(ans == -1) printf("-1\n");
  191. else printf("%d %d\n", a1-1, b1-1);
  192. }
  193. return 0;
  194. }

自己要是想缩短代码长度其实可以设个函数。

再看看THU的代码。。    有 1 -1 0 0 这种东西。。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<string>
  6. using namespace std;
  7.  
  8. const int MAX_N = 1000 + 10;
  9. int n;
  10.  
  11. //E,S,W,N
  12. int dx[4] = { 0, 1, 0, -1 }, dy[4] = { 1, 0, -1, 0 };
  13.  
  14. struct Walker {
  15. int x, y, d, turn;
  16. bool active;
  17.  
  18. bool vis[MAX_N][MAX_N]; //where had he visited
  19. void read(int turn) {
  20.  
  21. this->turn = turn;
  22. cin >> x >> y >> d;
  23.  
  24. active = true;
  25. memset(vis, 0, sizeof vis);
  26. }
  27.  
  28. bool check(int r, int c) {
  29. return r >= 0 && r < n && c >= 0 && c < n && !vis[r][c];
  30. }
  31.  
  32. void walk() { //can walk?
  33. //go stright
  34. if (check(x + dx[d], y + dy[d])) {
  35. x += dx[d], y += dy[d];
  36. goto end;
  37. }
  38. d = (d + turn) % 4;
  39. if (check(x + dx[d], y + dy[d])) {
  40. x += dx[d], y += dy[d];
  41. goto end;
  42. }
  43. active = false; //dead >_<
  44. return;
  45. end: {
  46. }
  47. vis[x][y] = true;
  48. }
  49. };
  50.  
  51. Walker A, B;
  52.  
  53. int main() {
  54. for (;;) {
  55. cin >> n;
  56. if (n == 0)
  57. break;
  58. A.read(1);
  59. B.read(3);
  60.  
  61. A.vis[A.x][A.y] = true;
  62. B.vis[B.x][B.y] = true;
  63.  
  64. for (;;) {
  65. if (!A.active && !B.active)
  66. break; //end!
  67. if (A.x == B.x && A.y == B.y) {
  68. cout << A.x << " " << A.y << endl;
  69. goto end;
  70. }
  71. if (A.active) {
  72. A.walk();
  73. }
  74. if (B.active) {
  75. B.walk();
  76. }
  77. }
  78.  
  79. cout << -1 << endl;
  80.  
  81. end: {
  82. }
  83. }
  84. }

hdu4740【杭州网赛、模拟、有点搜索?】的更多相关文章

  1. 杭州网赛 two rabbits (hdu 4745)

    算法很简单,问题是,怎么证明,答案是回文序列. 设a,b走的序列按顺时针是: a1 , a2 , a3 , ... , ak b1 , b2 , b3 , ... , bk 考虑端点的2种情况: 1. ...

  2. HDU4738【杭州网赛、判桥】

    刚拿到这道题时挺有思路,无奈平日里只敲过找割顶的代码,判桥的代码当时自己也没仔细敲. 当时一把泪啊,忽然感觉自己的图论才只是刚搞了个起步啊.. 题目有神坑.    就是先判是否连通,不连通直接输出0; ...

  3. 2013杭州网赛 1001 hdu 4738 Caocao's Bridges(双连通分量割边/桥)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 题意:有n座岛和m条桥,每条桥上有w个兵守着,现在要派不少于守桥的士兵数的人去炸桥,只能炸一条桥 ...

  4. hdu 4771 Stealing Harry Potter's Precious (2013亚洲区杭州现场赛)(搜索 bfs + dfs) 带权值的路径

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4771 题目意思:'@'  表示的是起点,'#' 表示的是障碍物不能通过,'.'  表示的是路能通过的: ...

  5. ZOJ Bizarre Routine 2013杭州网赛B题

    题目意思: 给定n, expect, a, b 要求你构造一组array[],存放一个1..n的排列,使的下面的程序能输出YES 题目所示代码: bool less_than(x, y) { T++; ...

  6. HDU 4746 HDOJ Mophues 2013杭州网赛I题

    比赛的时候就预感到这题能出,但是会耗时比较多.结果最后是出了,但是有更简单的题没出. 是不是错误的决策呢?谁知道呢 题目意思: 定义f(x) = x分解质因数出来的因子个数 如 x = p0 * p0 ...

  7. python--selenium简单模拟百度搜索点击器

    python--selenium简单模拟百度搜索点击器 发布时间:2018-02-28 来源:网络 上传者:用户 关键字: selenium 模拟 简单 点击 搜索 百度 发表文章摘要:用途:简单模拟 ...

  8. HDU 4738 Caocao's Bridges (2013杭州网络赛1001题,连通图,求桥)

    Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  9. Splinter学习--初探1,模拟百度搜索

    Splinter是以Selenium, PhantomJS 和 zope.testbrowser为基础构建的web自动化测试工具,基本原理同selenium 支持的浏览器包括:Chrome, Fire ...

随机推荐

  1. codevs1040 统计单词个数

    题目描述 Description 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k<= ...

  2. Node.js log2: ERR when execute command >npm install

    1.Node.js创建项目 项目microblog创建成功,提示:cd  microblog& npm install 项目创建完成时的目录如下图所示: 2.Node.js错误 如题所言: E ...

  3. CentOS7 lamp安装 centoOS6 lamp

    快速lamp安装 How To Install Linux, Apache, MySQL, PHP (LAMP) stack On CentOS 7 Introduction A "LAMP ...

  4. 自己改写了一个图片局部放大的jquery插件页面里面的html代码少了,同一个页面可以调用多个

    自己改写了一个图片局部放大的jquery插件页面里面的html代码少了,同一个页面可以调用多个,兼容ie8以上浏览器,别忘了引用jquery,我用的jquery/1.11.0/其他版本没有测试,另外需 ...

  5. Seek the Name, Seek the Fame(Kmp)

    Seek the Name, Seek the Fame Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 131072/65536K (J ...

  6. win7下安装Ubuntukylin-14.04双系统

    工具准备: 下载ISO系统镜像,UltraISO,EasyBCD,分区助手,8G 优盘 U盘启动制作流程: 1,打开分区助手,从硬盘中分出空闲空间(60G)作为Ubuntu工作空间,文件系统设为Ext ...

  7. Erp第一章:初感

    Erp第一章:初感1.核心标志实现:内部集成.外部集成.内部集成包括实现产品研发.核心业务.数据采集:外部集成就是企业与供需链上的所有合作伙伴的共享信息集成.2.Erp难点在于打破传统企业四面墙,把流 ...

  8. css3文本效果

    CSS3 包含多个新的文本特性. 在本章中,您将学到如下文本属性: 1. text-shadow 2. word-wrap 浏览器支持 Internet Explorer 10.Firefox.Chr ...

  9. IBATIS处理typeHandler类容易范的SQLException总结

    1. java.sql.SQLException: 无效的列类型 原因: A. ibatis的IN,OUT参数.或者typeHandler类中传入的参数值数据类型与Oracle自定义对象中的属性值的数 ...

  10. Oracle数据库按属性成绩查询

    create or replace function bb return nvarchar2as-----------自定义游标类型type class_student is record( snam ...