当前位置:   article > 正文

北航2023年机试题2

北航2023年机试题2

【问题描述】老鼠找食物,但是回家的时候找到最短路径,输入是x-y,x是1234其中一个,代表四个方向,y是向这个方向走的距离,比如:格式:数字-数字,0-0表示找到了,1-2表示向上走两步,2-3表示向下走3步,3-1表示向左走1步,4-2表示向右走两步,0-0表示找到了。

【要求】然后返回的时候,找到最短路径,然后要求给他找回头路,把重复的路给去掉,题目首先规定四个方向:1,2,3,4分别代表上下左右,输入序列形式为1-3,3-4.....,前一个数字代表方向,后一个数字代表前进距离,以0-0为结束,结束则代表老鼠找到了食物。

        老鼠在碰到死路时会原路返回到分叉路口,探索下一个方向。需要求解老鼠原路返回的最佳路径,以2-3,4-2.....等作为输出。最佳路径的描述是“不走回头路”,即没有折返过程即可。

示例1:输入:

1-1 3-1 1-1 2-1 4-2 1-2 4-1 1-1 2-1 3-1 1-1 0-0

输出:

2-3 3-1 2-1

示例2:输入:1-10 0-0

输出:2-10

示例3:

输入:1-1 4-1 1-1 4-1 3-1 1-1 2-1 4-2 1-1 0-0

输出:2-1 3-1 2-1 3-1 2-1 3-1 2-1 

代码思路:创建结构体存储每一步的全部动作,包括方向和步数,创建一个函数用来找到最短路径,用栈存储动作序列,判断动作方向与栈顶动作是否一致进行路径简化,最后倒序出站即为最终序列。

核心逻辑:通过将栈顶动作的方向当前动作的方向进行比较,如果相同则合并步数,若不相反则直接压入栈中,若相反则进行减法操作。这样,简化完成后的路径就是一条没有折返过程的最佳路径。两个容器一个栈(元素是一整个数组)。最最核心:代入的基本单位为整个结构体(类似于结构体数组,但这里初始化是结构体容器

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. bool panduan=true;
  4. struct Action{
  5. int direction;
  6. int steps;
  7. };
  8. vector<Action> shortest(vector<Action> p){//求最短路径的算法,直接返回一个结构体容器
  9. stack<Action> s;//用栈存储动作序列
  10. for(int i=0;i<p.size();i++){//将整个容器元素全部传入进行判断
  11. Action point= p[i];//获取当前动作
  12. if(s.empty()){
  13. s.push(point);//如果栈为空,直接将该点压入栈中
  14. }else{
  15. Action top=s.top();//获取栈顶动作,以上操作的基本单位均是结构体
  16. //如果当前动作与栈顶动作方向相反
  17. if((point.direction==1&&top.direction==2)||(point.direction==2&&point.direction==1)||(point.direction==3&&point.direction==4)||(point.direction==4&&point.direction==3)){
  18. //相减或者相消
  19. if(point.steps==top.steps){
  20. s.pop();//方向相反步数一样,可以认定为没有改变位置
  21. }else if(point.steps>top.steps){//与栈顶方向相反,走的路比栈顶元素多,重新更新栈顶方向和大小
  22. point.steps-=top.steps;
  23. s.pop();//出栈
  24. s.push(point);
  25. }else if(point.steps<top.steps){
  26. top.steps-=point.steps;
  27. s.pop();
  28. s.push(top);
  29. }
  30. }
  31. else{//如果当前动作与栈顶动作不相反,则直接将当前动作压入栈中
  32. s.push(point) ;
  33. }
  34. }
  35. }
  36. vector<Action> result;//用来存储结果的向量
  37. while(!s.empty()){//逆序进行处理栈中的元素,并合并同一方向的步数 ,遍历
  38. Action point=s.top();//获取栈顶元素(结构体)
  39. s.pop();//弹出栈顶元素(结构体)
  40. //方向倒置一下进行输出
  41. if(point.direction==1){
  42. point.direction=2;
  43. } else if(point.direction==2){
  44. point.direction=1;
  45. }else if(point.direction==3){
  46. point.direction=4;
  47. }else if(point.direction==4){
  48. point.direction=3;
  49. }
  50. if(!result.empty()&& point.direction==result.back().direction){//如果当前动作和结果中最后一个动作一致
  51. result.back().steps+=point.steps;//result.back()是对最后一个元素的引用,相当于最新加入的元素
  52. }else{
  53. result.push_back(point);//如果不同,证明方向已经改变或者是第一个元素,加入该元素。
  54. }
  55. }
  56. return result; //结构体向量
  57. }
  58. vector<Action> x;//存储每一步的全部信息
  59. int main(){
  60. int x1,y1;
  61. char xing;
  62. while(panduan){//读取方向,节点元素
  63. Action po;
  64. cin>>x1>>xing>>y1;
  65. po.direction=x1;
  66. po.steps=y1;
  67. x.push_back(po);
  68. if(x1==0&&y1==0){
  69. panduan=false;
  70. }
  71. }
  72. vector<Action> y=shortest(x);//再创建一个结构体向量接收返回结果
  73. for(int i=0;i<y.size();i++){
  74. Action action=y[i];
  75. if(action.direction==0&&action.steps==0){
  76. continue;
  77. }else{
  78. cout<<action.direction<<"-"<<action.steps<<endl;
  79. }
  80. }
  81. }

欢迎指正。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/358431
推荐阅读
相关标签
  

闽ICP备14008679号