TBACAMILLE 2018-06-15 13:00 采纳率: 50%
浏览 797
已采纳

入门经典紫书第五章木块问题(UVa 101)答案超时但与书上答案几乎相同

自己的答案

 #include<cstdio>
#include<string>
#include<vector>
#include<iostream>
using namespace std;

const int maxn = 30;
vector<int> Dui[maxn];
int n;

void print(){
     for(int i = 0 ; i<n ; i++){
         printf("%d:",i);
         for(int j = 0;j<Dui[i].size();j++){
            printf(" %d",Dui[i][j]);
         }
         printf("\n");
     }
}

void Find_block(int &p , int &h , int x){
    for(p = 0 ; p<n ; p++){     //要找到位置,那么就不能使用局部变量,要让位置变化
       for(h = 0 ; h<Dui[p].size(); h++){   //因为在vector中列数是不确定的,可以随时增减
          if(Dui[p][h] == x) return;  //直接结束调用,因为位置都为全局变量,返回的位置就是p(p1,p2),h(h1,h2)
       }
    }
}

void Move_back(int p, int h){
     int x;
     for(int i = h+1 ; i<Dui[p].size() ; i++){
         x = Dui[p][i];
         Dui[p].push_back(x);
     }
     Dui[p].resize(h+1);
}

void Move_change(int pa,int pb,int ha){
      for(int i = ha; i<Dui[pa].size() ; i++){
           Dui[pb].push_back(Dui[pa][i]);
      }
      Dui[pa].resize(ha);
}

int main(){
   int a,b;
   string s1,s2;
   cin>>n;
   for(int i = 0;i<n;i++){
        Dui[i].push_back(i);
   }
   while(cin>>s1>>a>>s2>>b){
       int pa,pb,ha,hb;
       Find_block(pa,ha,a); //直接将位置返回给pa,ha;
       Find_block(pb,hb,b);
       if(pa==pb) continue;
       if(s1=="move") Move_back(pa,ha);
       if(s2=="onto") Move_back(pb,hb);
       Move_change(pa,pb,ha);
   }
   print();
   return 0;
}

书上的答案

 #include<cstdio>
#include<string>
#include<vector>
#include<iostream>
using namespace std;

const int maxn = 30;
int n;
vector<int>pile[maxn];

void find_block(int a, int &p, int &h){
    for(p=0 ; p<n ; p++)
      for(h=0; h<pile[p].size(); h++)
        if(pile[p][h]==a) return;
}

void clear_above(int p , int h){
   for(int i = h+1; i<pile[p].size(); i++){
       int b = pile[p][i];
       pile[b].push_back(b);
   }
   pile[p].resize(h+1);
}

void pile_onto(int p , int h, int p2){
   for(int i = h; i<pile[p].size(); i++)
      pile[p2].push_back(pile[p][i]);
   pile[p].resize(h);
}

void print(){
   for(int i = 0; i < n ; i++){
      printf("%d:",i);
      for(int j = 0; j < pile[i].size(); j++) printf(" %d",pile[i][j]);
      printf("\n");
   }
}

int main(){
   int a,b;
   cin >> n;
   string s1,s2;
   for(int i = 0; i<n; i++) pile[i].push_back(i);
   while(cin >> s1 >> a >> s2 >> b){
      int pa, pb, ha, hb;
      find_block(a, pa, ha);
      find_block(b, pb, hb);
      if(pa==pb) continue;
      if(s2 == "onto") clear_above(pb, hb);
      if(s1 == "move") clear_above(pa, ha);
      pile_onto(pa, ha, pb);
   }
   print();
   return 0;
}

已经找了一个小时了精疲力竭,实在不明白哪里超时,望各位大神相助,不胜感激

  • 写回答

3条回答 默认 最新

  • 默默悟问 2018-06-16 01:20
    关注

    哦,上面的分析有点问题,是对应书上的代码,但是它是把p的数据移动到b,不是移动到p本身。只找了这个点,其他你自己再看看。

    void clear_above(int p , int h){
       for(int i = h+1; i<pile[p].size(); i++){
           int b = pile[p][i];
           pile[b].push_back(b);
       }
       pile[p].resize(h+1);
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 删除虚拟显示器驱动 删除所有 Xorg 配置文件 删除显示器缓存文件 重启系统 可是依旧无法退出虚拟显示器
  • ¥15 vscode程序一直报同样的错,如何解决?
  • ¥15 关于使用unity中遇到的问题
  • ¥15 开放世界如何写线性关卡的用例(类似原神)
  • ¥15 关于并联谐振电磁感应加热
  • ¥60 请查询全国几个煤炭大省近十年的煤炭铁路及公路的货物周转量
  • ¥15 请帮我看看我这道c语言题到底漏了哪种情况吧!
  • ¥66 如何制作支付宝扫码跳转到发红包界面
  • ¥15 pnpm 下载element-plus
  • ¥15 解决编写PyDracula时遇到的问题