UVA101 The Blocks Problem 题解
题目链接:https://www.luogu.org/problemnew/show/UVA101
这题码量稍有点大。。。
分析:
这道题模拟即可。因为考虑到所有的操作vector可最快捷的实现,所以数组动态vector。每一种情况分别考虑。
其他的见代码注释
部分过长的注释防在这里,请对照序号到代码中查看。
①:wa意为a的位置,记录当前a所在位置的序号。
wb意为b的位置,记录当前b所在位置的序号。
ca意为a的层数,记录当前a所在这堆积木中第几个。
cb意为b的层数,记录当前b所在这堆积木中第几个。
其他定义显而易见。
②:search遍历一遍所有位置所有积木,找到a或b后记录他们的位置和位置中第几个,相当于为后面的一个初始化吧。
③:此函数即move onto,按照题意模拟即可,之后④⑤⑥均如此,具体模拟步骤会详细说明。
代码:
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
int wa,wb,ca,cb;//①
char s1[10],s2[10];
int a,b;
vector<int>v[30];
int n;
void search()//②
{
for(int i=0;i<n;i++)
{
for(int j=0;j<v[i].size();j++)
{
if(v[i][j]==a)
{
wa=i;
ca=j;
}
if(v[i][j]==b)
{
wb=i;
cb=j;
}
}
}
}
void moon()//③
{
for(int i=ca+1;i<v[wa].size();i++)
{
v[v[wa][i]].push_back(v[wa][i]);
}//把a以上的归位
for(int i=cb+1;i<v[wb].size();i++)
{
v[v[wb][i]].push_back(v[wb][i]);
}//把b以上的归位
v[wa].resize(ca);//只保留当前vector到a-1
v[wb].resize(cb+1);//但是b要保留,因为a是要摞到b上的
v[wb].push_back(a);//摞上去
}//下面的都换汤不换药,我想大家都应该知道
void moov()//④
{
for(int i=ca+1;i<v[wa].size();i++)
{
v[v[wa][i]].push_back(v[wa][i]);
}
v[wa].resize(ca);
v[wb].push_back(a);
}
void pion()//⑤
{
for(int i=cb+1;i<v[wb].size();i++)
{
v[v[wb][i]].push_back(v[wb][i]);
}
v[wb].resize(cb+1);
for(int i=ca;i<v[wa].size();i++)
{
v[wb].push_back(v[wa][i]);
}
v[wa].resize(ca);
}
void piov()//⑥
{
for(int i=ca;i<v[wa].size();i++)
{
v[wb].push_back(v[wa][i]);
}
v[wa].resize(ca);
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
v[i].push_back(i);
}
while(1)
{
scanf("%s",s1);
if(strcmp(s1,"quit")==0)break;//提前判断是否退出
scanf("%d%s%d",&a,s2,&b);
search();
if(wa==wb)continue;//根据题意,如果a和b在同一堆,那么忽略
if(strcmp(s1,"move")==0&&strcmp(s2,"onto")==0)moon();
if(strcmp(s1,"move")==0&&strcmp(s2,"over")==0)moov();
if(strcmp(s1,"pile")==0&&strcmp(s2,"onto")==0)pion();
if(strcmp(s1,"pile")==0&&strcmp(s2,"over")==0)piov();
//逐一判断每种操作,其中相应的子函数对应去两个单词的首字母连起来
}
for(int i=0;i<n;i++)
{
printf("%d:",i);//暂时不输出括号,有了再打
for(int j=0;j<v[i].size();j++)
{
printf(" %d",v[i][j]);//当前位置有积木,那么就打出来,别忘了空格
}
printf("\n");//每次换行
}
return 0;
}
UVA101 The Blocks Problem 题解的更多相关文章
- UVa101 The Blocks Problem(不定长数组vector)
The Blocks Problem 书上的一道例题,代码思路比较清晰,可以看懂. 相关知识: 若a是一个vector,则: a.size():读取它的大小 a.resize():改变大小 a.pus ...
- UVA-101 The Blocks Problem 栈模拟
终于AC了,这道题目去年寒假卡得我要死,最后一气之下就不做了...想想居然一年之久了,我本来都快忘了这道题了,最近发现白书的奥秘,觉得刘汝佳的题目真的相当练思维以及对代码的操作,决定又刷起题目来,这时 ...
- The Blocks Problem(vector)
题目链接:http://poj.org/problem?id=1208 The Blocks Problem Time Limit: 1000MS Memory Limit: 10000K Tot ...
- 【UVA - 101】The Blocks Problem(vector+模拟)
The Blocks Problem Descriptions:(英语就不说了,直接上翻译吧) 初始时从左到右有n个木块,编号为0~n-1,要求实现下列四种操作: move a onto b: 把a和 ...
- UVa 101 The Blocks Problem Vector基本操作
UVa 101 The Blocks Problem 一道纯模拟题 The Problem The problem is to parse a series of commands that inst ...
- UVa 101 - The Blocks Problem(积木问题,指令操作)
题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...
- POJ 1208 The Blocks Problem
The Blocks Problem Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5397 Accepted: 231 ...
- 木块问题(The Blocks Problem,Uva 101)
不定长数组:vector vector就是一个不定长数组.不仅如此,它把一些常用操作“封装”在了vector类型内部. 例如,若a是一个vector,可以用a.size( )读取它的大小,a.resi ...
- UVA101 【The Blocks Problem】
一个大模拟!!! 总的来说就是碰到move就要把a上面的全部放回原处. 如果碰到onto就要把b上面的全部放到原处. 因为move是只移动a一个,所以a上面的要归位,而pile是移一堆,所以不用. o ...
随机推荐
- delphi 获取当前进程的cpu占用率
type TProcessCpuUsage = record private FLastUsed, FLastTime: Int64; FCpuCount:Integer; publ ...
- 宿主机与虚拟机系统的USB设备切换
有时候我们需要在虚拟机的操作系统中进行一些USB设备的测试,但默认情况下USB设备是在宿主机系统里面的,那这个时候我们就要进行切换才能够达到目的,具体要怎么操作呢?下面讲解一下: 1. Ctrl+ ...
- windows qt 使用c++ posix接口编写多线程程序(真神奇)good
一.多线程是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序.一般情况下,两种类型的多任务处理:基于进程和基于线程.基于进程的多任务处理是程序的并发执行.基于线程的多任务处理 ...
- 深入windows的关机消息截获-从XP到Win7的变化(在XP中程序可以阻止关机,但是在Win7中程序无法阻止关机,可Block的时间从1秒调到了5秒) good
之前写了一个软件用于实验室的打卡提醒,其中一个重要的功能是在关机之前提醒当天晚上是否已经打卡.之前我是在WM_ENDSESSION中弹出一个模态对话框来提醒,在XP中基本工作正常,在Win7中大多数时 ...
- 使用BCP批量导入数据
本文原创,转载请标明出处 BCP 工具的使用 The bulk copy program utility (bcp) bulk copies data between an instance of M ...
- hive数据倾斜的解决办法
数据倾斜是进行大数据计算时常见的问题.主要分为map端倾斜和reduce端倾斜,map端倾斜主要是因为输入文件大小不均匀导致,reduce端主要是partition不均匀导致. 在hive中遇到数据倾 ...
- Java集合 LinkedList的原理及使用
Java集合 LinkedList的原理及使用 LinkedList和ArrayList一样是集合List的实现类,虽然较之ArrayList,其使用场景并不多,但同样有用到的时候,那么接下来,我们来 ...
- wireshark和nmap
原创博客,转载请注出处! 关于Wireshark和Nmap实验报告 Wireshark部分 一.捕获三次握手报并分析 如上图所示,简述三次握手流程: Step1.客户端由56780号端口向服务器443 ...
- vue 开发webapp 手机返回键 退出问题
vue 开发webapp 手机返回键 退出问题 mui进行手机物理键的监听 首先安装 vue-awesome-mui npm i vue-awesome-mui 在main.js注册 在index.h ...
- jQuery入门——实现列表的显示隐藏与实现轮播图
列表的显示与隐藏 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head& ...