做不出来的同志直接把代码抄上吧

  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. short row,col,vis[20][20],ans[100],ansl,v[100],stack[100][2],used1[20][20],z;
  5. char maze[20][20];
  6. const short dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
  7. void solve(int x,int y,int len)
  8. {
  9. short i,j,top,bottom,xx,yy;
  10. if((len>ansl)||(len==ansl)&&(z==1))
  11. {
  12. memcpy(ans,v,sizeof(v));
  13. ansl=len;
  14. z=0;
  15. }
  16. memset(used1,0,sizeof(used1));
  17. used1[x][y]=1;
  18. top=0;bottom=1;
  19. stack[0][0]=x;
  20. stack[0][1]=y;
  21. while(top<bottom)
  22. {
  23. for(i=0;i<4;i++)
  24. {
  25. xx=stack[top][0]+dx[i];
  26. yy=stack[top][1]+dy[i];
  27. if((xx>=0)&&(xx<row)&&(yy>=0)&&(yy<col)&&(maze[xx][yy]!='#')&&(vis[xx][yy]==0)&&(used1[xx][yy]==0))
  28. {
  29. stack[bottom][0]=xx;
  30. stack[bottom][1]=yy;
  31. used1[xx][yy]=1;
  32. bottom++;
  33. }
  34. }
  35. top++;
  36. }
  37. if(len+top-1<ansl||(len+top-1==ansl)&&(z==-1))
  38. return;
  39. for(i=0;i<4;i++)
  40. {
  41. xx=x+dx[i];
  42. yy=y+dy[i];
  43. if((xx>=0)&&(xx<row)&&(yy>=0)&&(yy<col)&&(maze[xx][yy]!='#')&&(vis[xx][yy]==0))
  44. {
  45. v[len]=maze[xx][yy]-'0';
  46. vis[xx][yy]=1;
  47. if(z!=0)
  48. solve(xx,yy,len+1);
  49. else if(len>=ansl)
  50. {
  51. z=1;
  52. solve(xx,yy,len+1);
  53. z=0;
  54. }
  55. else
  56. {
  57. if (v[len]>ans[len])
  58. {
  59. z=1;
  60. solve(xx,yy,len+1);
  61. z=0;
  62. }
  63. else if(v[len]==ans[len])
  64. {
  65. z=0;
  66. solve(xx,yy,len+1);
  67. z=0;
  68. }
  69. else
  70. {
  71. z=-1;
  72. solve(xx,yy,len+1);
  73. z=0;
  74. }
  75. }
  76. vis[xx][yy]=0;
  77. }
  78. }
  79. }
  80. int main()
  81. {
  82. short i,j;
  83. while(true)
  84. {
  85. cin>>row>>col;
  86. if((row==0)&&(col==0))
  87. break;
  88. for(i=0;i<row;i++)
  89. cin>>maze[i];
  90. memset(ans,0,sizeof(ans));
  91. ans[0]=-1;
  92. ansl=1;
  93. memset(v,0,sizeof(v));
  94. for(i=0;i<row;i++)
  95. for(j=0;j<col;j++)
  96. if(maze[i][j]!='#')
  97. {
  98. vis[i][j]=1;
  99. v[0]=maze[i][j]-'0';
  100. if(maze[i][j]-'0'>ans[0])
  101. {
  102. z=1;
  103. solve(i,j,1);
  104. }
  105. else if(maze[i][j]-'0'==ans[0])
  106. {
  107. z=0;
  108. solve(i,j,1);
  109. }
  110. else if(maze[i][j]-'0'<ans[0])
  111. {
  112. z=-1;
  113. solve(i,j,1);
  114. }
  115. vis[i][j]=0;
  116. }
  117. for(i=0;i<ansl;i++)
  118. cout<<ans[i];
  119. cout<<endl;
  120. }
  121. return 0;
  122. }

嘘,这道题连续让我对着电脑两个多钟,千万别告诉我爸妈,否则我就惨了

点赞(0)
 

9.9 分

2 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 1 条评论