HDU 1242 Rescue (DFS)

清疚 2022-06-08 08:42 253阅读 0赞
  1. //题意自己看,不会度娘
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <string.h>
  5. char map[205][205];//地图
  6. int flag[205][205];//标记
  7. int n,m,ok,num;
  8. void DFS(int x,int y,int step)
  9. {
  10. if(flag[x][y]||map[x][y]=='#'||step>=num)//剪枝。如果走到墙或者步数不是最少还有这个坐标已经走过
  11. return;
  12. if(map[x][y]=='r')//表示已经营救成功
  13. {
  14. ok=1;
  15. if(step<num)
  16. num=step;
  17. return;
  18. }
  19. if(map[x][y]=='x')//如果是警卫,步数加一
  20. step++;
  21. flag[x][y]=1;//将flag[x][y]标记为1表示已走
  22. DFS(x+1,y,step+1);
  23. DFS(x-1,y,step+1);
  24. DFS(x,y+1,step+1);
  25. DFS(x,y-1,step+1);//四个方向一一走过,可以继续走的话就继续往下走
  26. flag[x][y]=0;//如果运行到这里说明四个方向都不行,将flag[x][y]重新标记为未走
  27. }
  28. int main(int argc, char *argv[])
  29. {
  30. while(~scanf("%d %d%*c",&n,&m))
  31. {
  32. int si,sj,i,j;
  33. memset(map,'#',sizeof(map));
  34. for(i=1;i<=n;i++)
  35. {
  36. for(j=1;j<=m;j++)
  37. {
  38. scanf("%c",&map[i][j]);
  39. if(map[i][j]=='a')
  40. {
  41. si=i;
  42. sj=j;
  43. }//标记位置
  44. }
  45. getchar();
  46. }
  47. ok=0;
  48. num=100000;
  49. DFS(si,sj,0);
  50. if(ok)
  51. printf("%d\n",num);
  52. else
  53. printf("Poor ANGEL has to stay in the prison all his life.\n");
  54. }
  55. return 0;
  56. }
  57. //Start-ZJ

发表评论

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

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

相关阅读

    相关 HDU 1242(bfs)

    题意:一个朋友拯救angel,'a' 是angel, 'x'是士兵, 'r'是朋友,'\'是墙壁。没走一步花费一个单位的时间,遇到士兵与士兵搏斗花费一个单位的时间,求最短时间。