HDU 1035 Robot Motion(dfs + 模拟)

系统管理员 2023-06-04 13:55 225阅读 0赞

嗯…

#

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1035

这道题比较简单,但自己一直被卡,原因就是在读入mp这张字符图的时候用了scanf被卡…

注意初始化和dfs边界:如果超出图或者曾经被标记过则输出

AC代码:

ContractedBlock.gif ExpandedBlockStart.gif

  1. 1 #include<cstdio>
  2. 2 #include<cstring>
  3. 3 #include<iostream>
  4. 4
  5. 5 using namespace std;
  6. 6
  7. 7 char mp[1005][1005];
  8. 8 int k, a, b, c, flag[1005][1005];
  9. 9
  10. 10 inline void dfs(int x, int y){
  11. 11 if(x <= 0 || y <= 0 || x > a || y > b){
  12. 12 printf("%d step(s) to exit\n", k);
  13. 13 return;
  14. 14 }
  15. 15 if(flag[x][y] != 0){
  16. 16 printf("%d step(s) before a loop of %d step(s)\n", flag[x][y] - 1, k - flag[x][y] + 1);//k - (flag[x][y] - 1)
  17. 17 return;
  18. 18 }
  19. 19 if(mp[x][y] == 'E'){
  20. 20 k++;
  21. 21 flag[x][y] = k;
  22. 22 dfs(x, y + 1);
  23. 23 }
  24. 24 else if(mp[x][y] == 'W'){
  25. 25 k++;
  26. 26 flag[x][y] = k;
  27. 27 dfs(x, y - 1);
  28. 28 }
  29. 29 else if(mp[x][y] == 'N'){
  30. 30 k++;
  31. 31 flag[x][y] = k;
  32. 32 dfs(x - 1, y);
  33. 33 }
  34. 34 else if(mp[x][y] == 'S'){
  35. 35 k++;
  36. 36 flag[x][y] = k;
  37. 37 dfs(x + 1, y);
  38. 38 }
  39. 39 }
  40. 40
  41. 41 int main(){
  42. 42 while(scanf("%d%d%d", &a, &b, &c) != EOF && a + b){
  43. 43 memset(flag, 0, sizeof(flag));
  44. 44 for(int i = 1; i <= a; i++)
  45. 45 for(int j = 1; j <= b; j++)
  46. 46 cin >> mp[i][j];//scanf会被卡
  47. 47 k = 0;
  48. 48 dfs(1, c);
  49. 49 }
  50. 50 return 0;
  51. 51 }

AC代码

转载于:https://www.cnblogs.com/New-ljx/p/11406188.html

发表评论

表情:
评论列表 (有 0 条评论,225人围观)

还没有评论,来说两句吧...

相关阅读

    相关 HDU 6669 Game(模拟

    题意:给出n个区间,初始位置可选,依次到达相应的区间,每次可以移动一格或两格,求最小步数。 分析:依次将所有区间取交集,然后就变成了一些不重合的区间,第一次可以选择区间