HDU 4255 A Famous Grid

举报
Linux猿 发表于 2021/08/04 23:44:21 2021/08/04
【摘要】 题目链接~~>                  先生成蛇型矩阵,然后再筛选出素数进行标记,最后bfs。这里要注意题目要求的1-10000的之间的数路径,但是并不代表我们只要打印到这个范围的素数,因为...

题目链接~~>

                 先生成蛇型矩阵,然后再筛选出素数进行标记,最后bfs。这里要注意题目要求的1-10000的之间的数路径,但是并不代表我们只要打印到这个范围的素数,因为很可能边沿的点需要走到外面的图形来完成对短路,外围的也不要打印太多,毕竟素数的个数越到外面是越稀疏的,所以打印到40000足矣。开始生成素数时1—10000结果wa了!!     

代码:


  
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<math.h>
  4. #include<queue>
  5. using namespace std;
  6. int x2,y2;
  7. int g[202][202],dx[4]={1,-1,0,0},dy[4]={0,0,-1,1};
  8. int vis[202][202];
  9. struct zhang
  10. {
  11. int x,y,bu;
  12. };
  13. void noprime(int x,int y)
  14. {
  15. int f=0 ;
  16. if(g[x][y]==1)
  17. g[x][y]=1 ;
  18. else
  19. {
  20. for(int i=2;i<=sqrt(g[x][y]);i++)
  21. if(g[x][y]%i==0)
  22. {
  23. f=1;
  24. break;
  25. }
  26. if(f==0)
  27. g[x][y]=0 ;
  28. }
  29. }
  30. int bfs(int x,int y)
  31. {
  32. queue<zhang>q;
  33. zhang current,next;
  34. memset(vis,0,sizeof(vis));
  35. current.x=x;
  36. current.y=y;
  37. current.bu=0;
  38. q.push(current);
  39. while(!q.empty())
  40. {
  41. current=q.front();
  42. q.pop();
  43. for(int i=0;i<4;i++)
  44. {
  45. next.x=current.x+dx[i];
  46. next.y=current.y+dy[i];
  47. if(next.x>=0&&next.x<200&&next.y>=0&&next.y<200&&!vis[next.x][next.y]&&g[next.x][next.y])
  48. {
  49. next.bu=current.bu+1;
  50. vis[next.x][next.y]=1;
  51. if(next.x==x2&&next.y==y2)
  52. return next.bu;
  53. q.push(next);
  54. }
  55. }
  56. }
  57. return -1 ;
  58. }
  59. int main()
  60. {
  61. int a1=-1,a2=200,a3=200,a4=-1;
  62. int x=40000,i,j;
  63. for(i=0;i<100;i++)
  64. {
  65. a1++;
  66. for(j=a1;j<200-a1-1;j++)
  67. g[a1][j]=x-- ;
  68. a2--;
  69. for(j=a1;j<200-a1-1;j++)
  70. g[j][a2]=x-- ;
  71. a3--;
  72. for(j=200-a1-1;j>a1;j--)
  73. g[a3][j]=x-- ;
  74. a4++;
  75. for(j=200-a1-1;j>a1;j--)
  76. g[j][a4]=x-- ;
  77. }
  78. for(i=0;i<200;i++)
  79. for(j=0;j<200;j++)
  80. noprime(i,j) ;//标记素数!!
  81. int n,m,x1,y1,t=0;
  82. while(scanf("%d%d",&n,&m)!=EOF)
  83. {
  84. for(i=0;i<200;i++)
  85. for(j=0;j<200;j++)
  86. if(g[i][j]==n)
  87. {
  88. x1=i;
  89. y1=j;
  90. }
  91. else if(g[i][j]==m)
  92. {
  93. x2=i;
  94. y2=j;
  95. }
  96. printf("Case %d: ",++t) ;
  97. if(n==m)
  98. {
  99. printf("0\n");
  100. continue;
  101. }
  102. int min=bfs(x1,y1) ;
  103. if(min==-1)
  104. printf("impossible\n");
  105. else printf("%d\n",min);
  106. }
  107. return 0 ;
  108. }


 

 

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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