洛谷P2790 ccj与zrz之积木问题 题解
2024-08-29 20:38:50
题目链接:https://www.luogu.org/problemnew/show/P2790
这题码量稍有点大。。。
分析:
这道题模拟即可。因为考虑到所有的操作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;
}
最新文章
- python基础知识7——迭代器,生成器,装饰器
- [转] 配置Log4j
- DrClient 校园网客户端破解
- 作为WEB工程师,我们是不是应该积极的推进一下用户浏览器的使用体验?
- 使用jquery构建Metro style 返回顶部
- ZOJ 1110 Dick and Jane
- How to disable Passwords must meet complexity requirements[windows 7]
- 原生Js获取某个节点后面的第一个标签
- sharepoint 自定义字段实现省市联动
- mac上设置sudo不要密码
- Intellij Idea 2016创建web项目
- 创建 Visual Studio 2017 离线安装
- Thinking in work
- span的title标签中的换行
- asp.net core cors中间件
- Python高级网络编程系列之第三篇
- 10.Solr4.10.3数据导入(DIH全量增量同步Mysql数据)
- 青岛大学开源OJ平台搭建
- hadoop-lzo 安装配置
- 关联容器map(红黑树,key/value),以及所有的STL容器详解
热门文章
- Compile for Windows on Linux(交叉编译,在Linux下编译Windows程序),以OpenSSL为例
- zyltimer与ZylIdleTimer
- qt中用tcp传输xml消息 good
- Windows下获取逻辑cpu数量和cpu核数量(用GetLogicalProcessorInformation,从XP3才开始有的API)
- CSocket实现端口扫描
- SYN5307型数字式电秒表
- gitlab安装笔记三_Centos7安装GitLab
- spring cloud 系列第2篇 —— eureka 高可用注册中心的搭建 (F版本)
- 火眼推出Windows免费渗透测试套件,包含140多款工具
- ASP.NET Core MVC 之路由(Routing)