HDU 2531 Catch him

举报
Linux猿 发表于 2021/08/05 00:57:37 2021/08/05
【摘要】 题目链接~~>                这题坑了我好久,还是那句话只要你真心去做一定能想出办法来。这题办法倒是想出来了,但是我标记的是身体的全部,每次都这样,只有检测到全部被标记时才不继续往下搜索,测试数据试很多也没找出错误...

题目链接~~>

               这题坑了我好久,还是那句话只要你真心去做一定能想出办法来。这题办法倒是想出来了,但是我标记的是身体的全部,每次都这样,只有检测到全部被标记时才不继续往下搜索,测试数据试很多也没找出错误来,最后才知道只要标记一个就行,而且必须一直标记同一个。。委屈

代码:


  
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<queue>
  4. using namespace std ;
  5. int r ;
  6. int n,m ;
  7. int vx[105],vy[105] ;
  8. char s[105][105] ;
  9. int vis[105][105] ;
  10. int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1} ;
  11. struct zhang
  12. {
  13. int x[25],y[25],bu ;
  14. } ;
  15. int bfs()
  16. {
  17. queue<zhang>q ;
  18. zhang current,next ;
  19. int i,j,k ;
  20. int nx,ny ;
  21. for(i=0;i<r;i++)
  22. {
  23. current.x[i]=vx[i] ;
  24. current.y[i]=vy[i] ;
  25. }
  26. vis[current.x[0]][current.y[0]]=1 ;//每次标记开始那一点
  27. current.bu=0 ;
  28. q.push(current) ;
  29. while(!q.empty())
  30. {
  31. current=q.front() ;
  32. q.pop() ;
  33. for(i=0;i<4;i++)
  34. {
  35. int p=0,ret=0 ;
  36. for(j=0;j<r;j++)
  37. {
  38. next.x[j]=current.x[j]+dx[i] ;
  39. next.y[j]=current.y[j]+dy[i] ;
  40. nx=next.x[j] ;
  41. ny=next.y[j] ;
  42. if(!j&&vis[nx][ny])
  43. ret=1 ;
  44. if(nx<0||nx>=n||ny<0||ny>=m||s[nx][ny]=='O')
  45. {
  46. ret=1 ;
  47. break ;
  48. }
  49. if(s[nx][ny]=='Q')
  50. p=1 ;
  51. }
  52. if(ret)
  53. continue ;
  54. if(p)
  55. return current.bu+1 ;
  56. for(k=0;k<r;k++)
  57. {
  58. next.x[k]=current.x[k]+dx[i] ;
  59. next.y[k]=current.y[k]+dy[i] ;
  60. nx=next.x[k] ;
  61. ny=next.y[k] ;
  62. if(!k)
  63. vis[nx][ny]=1 ;
  64. }
  65. next.bu=current.bu+1 ;
  66. q.push(next) ;
  67. }
  68. }
  69. return -1 ;
  70. }
  71. int main()
  72. {
  73. int i,j ;
  74. while(scanf("%d%d",&n,&m)!=EOF)
  75. {
  76. if(!n&&!m)
  77. break ;
  78. r=0 ;
  79. memset(vis,0,sizeof(vis)) ;
  80. for(i=0;i<n;i++)
  81. {
  82. scanf("%s",s[i]) ;
  83. for(j=0;j<m;j++)
  84. if(s[i][j]=='D')
  85. {
  86. vx[r]=i ;
  87. vy[r]=j ;
  88. r++ ;
  89. }
  90. }
  91. int mx=bfs() ;
  92. if(mx==-1)
  93. printf("Impossible\n") ;
  94. else printf("%d\n",mx) ;
  95. }
  96. return 0 ;
  97. }


 

文章来源: blog.csdn.net,作者:Linux猿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nyist_zxp/article/details/12390047

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。