UVa101 关于Vector用法

#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[x].push_back(x);       //错误点:将应该将x值传入x堆而不是p堆
     }
     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;
}

/*题目大意:
      操作一:a,b上方木块全部归位,把a放在b上 —— move a onto b;
            找位置(得到pa,pb,ha,hb)——>归位——>
      操作二:a上方木块全归位,把a放在b和上面整体的顶端 —— move a over b;
      操作三:把b上的木块归位,把a和上面的整体放在b上 —— pile a onto b;
      操作四:把a和上面的整体放在b上面整体上 —— pile a over b;
*/

/*
    问题:1.怎么找每一块值的位置?
               答:传入堆地址,在堆上的地址,直接for循环遍历找,因为位置都为全局变量,找到后直接返回

              2.能不能用==比较字符串内容?
              答:在C语言中不可以,在C++中可以(定义string)。因为C语言中的==是用来比较a、b变量的值
              如果是字符串,使用==只能比较开头地址了,如果要比较值,使用strcmp();

              3.上述时间超出怎么办
              答:1)减少函数调用的次数,找到每个方法的共同之处总合
                     2)查看for循环内的算法是否正确(是否写错变量)
*/
/*

知识点 :如果a是一个vector数组,则:
      ——vector<int>名字[大小];
      1. a.size()读取大小
      2. a.resize()改变大小
      3. a.push_back()向尾部添加元素
      4. a.pop_back()删除最后一个元素
      5. 可以用a[].clear()清空,a[].empty()测试是否为空
      6. a.back()返回最后一个元素
      7. a.insert(&adress , value) 在指定位置插入数据,例如intsert(v.begin,3)
      8. a.insert(&adress , amount , value) 在指定位置插入amount个value,
          例如insert(v.begin,5,3) 在容器的开头传入五个三
*/
 

猜你喜欢

转载自blog.csdn.net/m0_37632283/article/details/81139174