一:题目

输入n,得到编号为0~n-1的木块,分别摆放在顺序排列编号为0~n-1的位置。现对这些木块进行操作,操作分为四种。

、move a onto b:把木块a、b上的木块放回各自的原位,再把a放到b上;

、move a over b:把a上的木块放回各自的原位,再把a发到含b的堆上;

、pile a onto b:把b上的木块放回各自的原位,再把a连同a上的木块移到b上;

、pile a over b:把a连同a上木块移到含b的堆上。

当输入quit时,结束操作并输出0~n-1的位置上的木块情况

(一)样例输入

move  onto
move over
move over
move over
pile over
pile over
move over
move over
quit

(二)样例输出

:
:
:
:
:
:
:
:
:
:

二:代码实现

#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 = ; i < num; i++)
for (int j = ; 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()-)
{
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 = ; 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 = ; 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 ;
}

算法习题---5.2木块问题(UVa101)的更多相关文章

  1. 【算法习题】数组中任意2个(3个)数的和为sum的组合

    题1.给定一个int数组,一个数sum,求数组中和为sum的任意2个数的组合 @Test public void test_find2() { int[] arr = { -1, 0, 2, 3, 4 ...

  2. July 算法习题 - 字符串4(全排列和全组合)

    https://segmentfault.com/a/1190000002710424 思想:当前层各节点首元素不同,则各节点的剩余元素也不同:下一层节点交换范围为首元素以外的元素 全排列算法: vo ...

  3. 算法习题---4-9数据挖掘(Uva1591)

    一:题目 这是最懵逼的一道题,什么鬼......... [刷题]算法竞赛入门经典(第2版) 4-9/UVa1591 - Data Mining(详细题目看这个吧,不想多说) 二:代码实现 #defin ...

  4. tarjan算法 习题

    dfs树与tarjan算法 标签(空格分隔): 517coding problem solution dfs树 tarjan Task 1 给出一幅无向图\(G\),在其中给出一个dfs树\(T\), ...

  5. 【算法习题】正整数数组中和为sum的任意个数的组合数

    1.递归实现(参考:https://blog.csdn.net/hit_lk/article/details/53967627) public class Test { @org.junit.Test ...

  6. 算法习题-FFT

    Q1(hdu1402): 给出两个很大的数字A,B,计算二者乘积. 分析:这个题目java应该能过,用FFT做能够加速计算.这里将字符串A按权(10进制)展开,前面的系数就是多项式的系数,这样就构造出 ...

  7. 算法习题---5-8图书管理系统*****<双向迭代器>(UVa230)

    一:题目 就是输入一系列书本名和作者名,然后输入命令模拟借书和还书,再输出归还的书的摆放位置.要求有两点: 需要对归还的书做特殊排序处理:作者名相同,则书本按书名从小到大排序:否则书本按作者名大小排序 ...

  8. 算法习题---5-7打印队列(UVa12100)

    一:题目 有一个打印机,有一些任务在排着队打印,每个任务都有优先级.打印时,每次取出队列第一个任务,如果它的优先级不是当前队列中最高的,就会被放到队尾,否则就打印出来.输出初始队列的第m个任务的打印时 ...

  9. 算法习题---5-6对称轴(UVa1595)

    一:题目 判断平面上的一组点,是否关于一条竖线对称.即找到一条垂直对称轴 (一)样例输入 - (二)样例输出 YES NO YES 二:代码实现 #define _CRT_SECURE_NO_WARN ...

随机推荐

  1. Python 过滤a文件中每一行内容,保存到b文件中

    #coding=utf-8print 1#初始化文件crash_log.log with open('e:/1/crash_log.log','w')as f: f.close() def fw(se ...

  2. python多线程扫描爆破网站服务器思路【笔记】

    这个扫描是概率问题,是需要字典的,以下代码是作为参考,字典可以去网上下载,我就不提供,我提供的是思路! #!/usr/bin/env python # coding=utf-8   from IPy ...

  3. 写一个python小程序

    在windows环境下进行操作 window+R 输入cmd  创建一个文件夹 mkdir pytxt 创建一个py文件 py.py  用notepad或者记事本等工具进行编辑 或 首先声明pytho ...

  4. koa2-router中间件来请求数据获取

    原理 虽然不使用中间件也能获取请求数据 对于POST请求的处理,koa-bodyparser中间件可以把koa2上下文的formData数据解析到ctx.request.body中. 安装koa2版本 ...

  5. 2019/8/20 Test

    题目 简述 做法 \(BSOJ2237\) 求\(\displaystyle{k\in G:\sum_{i\in G\vee j\in G}\frac{C^k_{i,j}}{C_{i,j}}}\),其 ...

  6. OPCode详解及汇编与反汇编原理

    1. 何为OPCode 在计算机科学领域中,操作码(Operation Code, OPCode)被用于描述机器语言指令中,指定要执行某种操作的那部分机器码,构成OPCode的指令格式和规范由处理器的 ...

  7. 学校的信息课(备战会考)LZ没带笔……

    IP地址 四段十进制数组成(四个字节,32个二进制位数,一个字节八位) 用“.”隔开 每一段的取值范围[0,255] 分类:看第一个字节(见到的大多为B,C类) A:1~126    B:128~19 ...

  8. codevs 1729 单词查找树

    二次联通门 : codevs 1729 单词查找树 /* codevs 1729 单词查找树 Trie树 统计节点个数 建一棵Trie树 插入单词时每新开一个节点就计数器加1 */ #include ...

  9. 通过 frp 实现群晖的 drive 远端同步

    通过 frp 实现 drive 同步 其实其他的也类似, 只是指定 tcp 的端口不一致就可以. frp 实现的外网端口映射"肥肠"方便. 也推广下 frp 的地址 frp-git ...

  10. 前端项目, 每次运行都需要输入 sudo 的解决方法

    前端项目, 每次运行都需要输入 sudo 的解决方法 node一直提示的sudo问题根本原因为: node 的所有者, 项目的所有者, 不同; 解决方法为: 将项目的所有者更改为 chown -R ` ...