【刘汝佳书】例题5-2 UVA101 (vector、二维数组的练习)

【2019.4.3】
刚受过信号与系统的灵魂洗礼,回来AC了这道题,
看编译群里吵来吵去,感觉有几句题外话想说,
就大学里这点破事,大家无外乎就是为了成绩,
世界上没有公平的事情,尤其是涉及到利益,一件也没有,
永远有那么多糟心的事、傻逼的人让我们苦恼,
但反抗永远与适应并存,
算法实验考试网崩了,在群里要求重考的同时,争取下次一遍过,
平时分自己挣,从老师手里抢,
勇士队被cp3吹掉了一场比赛,不仅要骂,下一场还要四十分赢回来,
登哥号称哈七公,场均36分带队赢球就完事了,
#最黑暗的世界逼出最强的我
#the underrated tour

#include <iostream>
#include <vector>
#include <cctype>

using namespace std;

void command(vector<vector<int>>& v, string s1, int n1, string s2, int n2);
void output(vector<vector<int>> v);
void findIndex(vector<vector<int>> v, int n, int& ni, int& nj);
void returnBlock(vector<vector<int>>& v, int n, int ni, int nj);

int main()
{
    int n;
    cin>>n;

    vector<vector<int>> block(n);
    for(int i=0; i<n; i++) block[i].push_back(i);

    getchar();
    string s1, s2;
    int n1, n2;
    while(cin>>s1 && s1[0]!='q') {
        cin >> n1 >> s2 >> n2;
        command(block, s1, n1, s2, n2);
    }
    output(block);

    return 0;
}

void command(vector<vector<int>>& v, string s1, int n1, string s2, int n2)
{
    int i1, j1, i2, j2;
    findIndex(v, n1, i1, j1);
    findIndex(v, n2, i2, j2);
    if(i1<0 || i2<0 || i1 == i2) return;

    if(s1=="move" && s2=="onto")
    {   //还原n1和n2上所有方块
        //cout<<'1'<<endl;
        returnBlock(v, n1, i1, j1);
        returnBlock(v, n2, i2, j2);
    }
    else if(s1=="move" && s2=="over")
    {   //还原n1上方块
        //cout<<'2'<<endl;
        returnBlock(v, n1, i1, j1);
    }
    else if(s1=="pile" && s2=="onto")
    {   //还原n2上方块
        //cout<<'3'<<endl;
        returnBlock(v, n2, i2, j2);
    }

    for(int j=j1; j<v[i1].size(); j++)
        v[i2].push_back(v[i1][j]);
    int popNum = v[i1].size()-j1;
    while(popNum--)
        v[i1].pop_back();
}

void findIndex(vector<vector<int>> v, int n, int& ni, int& nj)
{
    for(int i=0; i<v.size(); i++)
        for(int j=0; j<v[i].size(); j++)
            if(v[i][j] == n) {
                ni = i;
                nj = j;
                return;
            }
    return;
}

void returnBlock(vector<vector<int>>& v, int n, int nx, int ny)
{
    int x;
    for(int j=v[nx].size()-1; j>ny; j--) {
        x=v[nx][j];
        v[x].push_back(x);
        v[nx].pop_back();
    }
}

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

猜你喜欢

转载自blog.csdn.net/qq_41727666/article/details/88992893