现在的位置: 首页 > 综合 > 正文

UVa 101

2018年04月23日 ⁄ 综合 ⁄ 共 1971字 ⁄ 字号 评论关闭

背景:1Y!!!
注意这根据游戏规则,无论怎样放,如果一个堆有元素,那么最底层元素必是初始在这个堆的元素

思路:模拟整个过程即可。

学习:1.主要是vector容器的一些使用:

              a.还没有创建的空间不能用,v[]这种c语言的形式访问(就算reserve的预留空间也不行,除非用resize创建空间,否则只能push_back();)

              b.

<span id="transmark"></span>vector<int> v[10];     //相当于创建了一个行数一定,列数可变长的二维数组

我的代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
using namespace std;
vector<int> v[25];
int t1,t2,n;
struct place{int p,h;}p1,p2;

void find_place(int x,int y){     //找到t1,t2目前所在的堆和高度。
     for(int i=0;i < n;i++){
        for(int j=0;j < v[i].size();j++){
            if(v[i][j] == t1) {
                if(y == x) {
                    p1.p=i;
                    p1.h=j+1;
                }else{
                    p2.p=i;
                    p2.h=j+1;
                }
                return;
            }
        }
     }
}

void moveonto(void){
     for(int i=v[p1.p].size()-1;i >= p1.h;i--){    //t1上面的数据放回初始位置
        v[v[p1.p][i]].push_back(v[p1.p][i]);
        v[p1.p].pop_back();
     }
     for(int i=v[p2.p].size()-1;i >= p2.h;i--){    //t2上面数据放回初始位置
        v[v[p2.p][i]].push_back(v[p2.p][i]);
        v[p2.p].pop_back();
     }
     v[p2.p].push_back(t1);
     v[p1.p].pop_back();
}

void pileonto(void){
    for(int i=v[p2.p].size()-1;i >= p2.h;i--){    //t2上面数据放回初始位置
        v[v[p2.p][i]].push_back(v[p2.p][i]);
        v[p2.p].pop_back();
     }
     vector<int> temp;
     for(int i=v[p1.p].size()-1;i >=p1.h-1;i--){
         temp.push_back(v[p1.p][i]);
         v[p1.p].pop_back();
     }
     for(;temp.size() != 0;){
         v[p2.p].push_back(temp.back());
         temp.pop_back();
     }
}

void moveover(void){
     for(int i=v[p1.p].size()-1;i >= p1.h;i--){    //t1上面的数据放回初始位置
        v[v[p1.p][i]].push_back(v[p1.p][i]);
        v[p1.p].pop_back();
     }
     v[p2.p].push_back(t1);
     v[p1.p].pop_back();
}

void pileover(void){
     vector<int> temp;
     for(int i=v[p1.p].size()-1;i >=p1.h-1;i--){
         temp.push_back(v[p1.p][i]);
         v[p1.p].pop_back();
     }
     for(;temp.size() != 0;){
         v[p2.p].push_back(temp.back());
         temp.pop_back();
     }
}

void make(void){
     string string1,string2;
l1:  cin>>string1;
     if(string1 == "quit") return;
     cin>>t1>>string2>>t2;
     find_place(t1,1);
     find_place(t2,2);
     if(p1.p == p2.p) goto l1;
     if(string1 == "move") string2 == "onto" ? moveonto() : moveover();
     else string2 == "onto" ? pileonto()  : pileover();
     goto l1;
}

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

int main(void){
    cin>>n;
    for(int i=0;i < n;i++) v[i].push_back(i);
    make();
    print();
}
【上篇】
【下篇】

抱歉!评论已关闭.