zoukankan      html  css  js  c++  java
  • 算法习题---5.2木块问题(UVa101)

    一:题目

    输入n,得到编号为0~n-1的木块,分别摆放在顺序排列编号为0~n-1的位置。现对这些木块进行操作,操作分为四种。
    
    1、move a onto b:把木块a、b上的木块放回各自的原位,再把a放到b上;
    
    2、move a over b:把a上的木块放回各自的原位,再把a发到含b的堆上;
    
    3、pile a onto b:把b上的木块放回各自的原位,再把a连同a上的木块移到b上;
    
    4、pile a over b:把a连同a上木块移到含b的堆上。
    
    当输入quit时,结束操作并输出0~n-1的位置上的木块情况

    (一)样例输入

    10
    move 9 onto 1
    move 8 over 1
    move 7 over 1
    move 6 over 1
    pile 8 over 6
    pile 8 over 5
    move 2 over 1
    move 4 over 9
    quit

    (二)样例输出

     0: 0
     1: 1 9 2 4
     2:
     3: 3
     4:
     5: 5 8 7 6
     6:
     7:
     8:
     9:

    二:代码实现

    #define _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    #include <vector>
    #include <string>
    
    using namespace std;
    
    #define MAX 30
    vector<int> column[MAX];
    int num;
    int a_n, a_m, b_n, b_m;

    通过引用返回行列数

    void find_col(int a,int &n,int &m)
    {
        for (int i = 0; i < num; i++)
            for (int j = 0; j < column[i].size();j++)
                if (column[i][j] == a)
                    n = i, m = j;
    }

    返回该操作数所在列数

    //返回所操作列数
    int PushOldPos(int a)
    {
        int n, m;
        find_col(a, n, m);
        while (m < column[n].size()-1)
        {
            int i = column[n][++m];
            column[i].push_back(i);
        }
        return n;
    }

    四个操作函数

    void MoveAOntoB(int a, int b)
    {
        //将a上面的数据全部归位
        a_n = PushOldPos(a);
        //将b上面的数据全部归位
        b_n = PushOldPos(b);
    
        //将a放入b上
        column[b_n].push_back(column[a_n].back());
        column[a_n].pop_back();
    }
    
    void MoveAOverB(int a, int b)
    {
        //将a上面的数据全部归位
        a_n = PushOldPos(a);
    
        //将a放入b上
        column[b_n].push_back(column[a_n].back());
        column[a_n].pop_back();
    }
    void PileAOntoB(int a, int b)
    {
        //将b全部归位
        b_n = PushOldPos(b);
    
        for (int i = a_m; i < column[a_n].size(); i++)
            column[b_n].push_back(column[a_n][i]);
    
        column[a_n].resize(a_m);
    }
    
    void PileAOverB(int a, int b)
    {
        for (int i = a_m; i < column[a_n].size(); i++)
            column[b_n].push_back(column[a_n][i]);
    
        column[a_n].resize(a_m);
    }

    打印函数

    void PrintAllCol()
    {
        //进行打印
        for (int i = 0; i < num;i++)
        {
            cout << i << ": ";
            for (vector<int>::iterator iter = column[i].begin(); iter != column[i].end(); iter++)
                cout << *iter << " ";
            cout << endl;
        }
    }

    主函数

    int main()
    {
        freopen("data5_2.in", "r", stdin);
        freopen("data5_2.out", "w", stdout);
        
        string a_str, b_str;
        int a,b;
        cin >> num; //获取总的盒子数
    
        //初始化向量
        for (int i = 0; i < num; i++)
            column[i].push_back(i);
    
        //获取命令进行处理
        while (true)
        {
            cin >> a_str;
            if (a_str == "quit")
                break;
            cin >> a >> b_str >> b;
    find_col(b, b_n, b_m);
    find_col(a, a_n, a_m);  //先找到两个数各自的行列数 if (a_n == b_n)  //如果在同一行,则操作失效 continue; if (a_str == "move") if (b_str == "over") MoveAOverB(a, b); else MoveAOntoB(a, b); else if (b_str == "over") PileAOverB(a, b); else PileAOntoB(a, b); } PrintAllCol(); freopen("CON", "r", stdin); freopen("CON", "w", stdout); return 0; }
  • 相关阅读:
    Selenium python 常用定位方法
    第四周总结
    python自然语言处理——提取关键词,标签
    python 调用百度地图api接口获取地理详细信息行政代码等
    python分词技术——jieba安装使用
    质量属性战术--6.易用性战术
    Kettle的使用——大数据清洗技术
    周总结2
    DataX的使用——大数据同步技术
    python编程:从入门到实践
  • 原文地址:https://www.cnblogs.com/ssyfj/p/11512231.html
Copyright © 2011-2022 走看看