[CSP-S模拟测试]:小P的2048(模拟)
题目描述
最近,小$P$迷上了一款叫做$2048$的游戏。这块游戏在一个$n\times n$的棋盘中进行,棋盘的每个格子中可能有一个形如$2^k(k\in N^*)$的数,也可能是空的。游戏规则介绍如下:
$1.$游戏开始时棋盘内将会生成两个数字,生成的数字仅可能为$2$或$4$;
$2.$每次操作,玩家可以选择上、下、左、右四个方向进行平移;
$3.$以向上平移为例,从上往下考虑每个不为空的格子,若上方与之相邻的格子为空,则将该格子上的数字移动至相邻格子。在一次位移中,每个数字会进行多次移动直到不能移动为止。
$4.$以向上平移为例,从上往下考虑每个不为空的格子,若上方与之相邻的数字恰好与其相等,则两个数字可以合并,新生成的数字为原来两个数之和。在一次合并中,每个数字只能与其它数合并一次,可以同时合并多对数字,但不能连续合并;
$5.$每次操作由位移+合并+位移组成,若操作后棋盘局面发生变化,则该操作为有效操作,其有效得分为合并过程中所有新生成的数字之和;
$6.$在每次操作后,棋盘内都会新生成一个数字$2$或$4$,数字只会在空格子处生成;
$7.$当棋盘被数字填满,玩家无法进行任何有效操作时,游戏结束,游戏总得分为所有操作的有效得分之和。
为了降低难度,小$P$对$2048$游戏进行了一些改动。在游戏开始前,小$P$会告诉你棋盘的初始状态,并给你若干次操作。每次操作由方向变量、位置参数和一个数字组成,方向变量代表你在本次操作中的移动方向,给定的数字为本次操作之后将会生成的数字的大小,而位置参数将决定生成数字的位置。若位置参数为$K$,操作后棋盘中空格子的数量为$r$,则生成数字的位置从上到下、从左到右第$(1+K\mod r)$个空格子。如果每次操作为无效操作,则游戏结束,而当所有操作都完成后,游戏同样结束。(注意:改动后,游戏结束时棋盘不一定被数字填满。)
现在小$P$问你,在游戏结束前你一共进行了多少次有效操作,最后你的游戏总得分是多少。
输入格式
第一行为两个正整数$n$和$m$,分别表示棋盘的大小和操作的个数。
第二行为六个正整数$x_1,y_1,v_1$和$x_2,y_2,v_2$($x_1,y_1,x_2,y_2\leqslant n,v_1,v_2\in\{2,4\}$),分别代表游戏开始时,棋盘上两个数字的位置(行/列)的大小。行号从上往下的编号,列号从左往右的编号,编号均以$1$开始。
接下来$m$行,表示小$P$给你的$m$个操作。每行由三个自然数$D_i,K_i,V_i$组成,其中$D_i$代表本次操作的平移方向,$0/1/2/3$分别代表上/下/左/右。$K_i$为位置参数,$V_i$为操作后生成的数的大小。($D_i\in\{0,1,2,3\},K_i<2^{31},V_i\in\{2,4\}$)
输出格式
输出共两行,每行一个正证书,分别代表你完成的有效操作数与游戏总得分。
样例
样例输入:
3 6
2 1 2 3 2 4
1 14 2
1 6 4
2 10 2
0 3 2
2 17 2
3 14 4
样例输出:
4
12
数据范围与提示
样例解释:
四次有效操作后,棋盘无法继续向左平移,故游戏结束,总得分为$4+8=12$。
数据范围:
对于$10\%$的数据:$n=2$
对于$40\%$的数据:$n\leqslant 4,m\leqslant 100$
对于$100\%$的数据:$2\leqslant n\leqslant 8,1\leqslant m\leqslant 100000$
题解
大模拟,注意以下几点:
$\alpha.$输出格式。
$\beta.$大样例中没有向右的操作,所以要特别注意向右(考试时因为这个挂到飞起……)
$\gamma.$数组勤清空。
$\delta.$有数据点一开始的两个坐标是一个,所以避免使用记录空格子的个数的方法。
时间复杂度:$\Theta(n^2m)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,v,x2,y2,v2;
int Map[10][10];
long long ans;
int que[10];
bool up(int k,int v)
{
bool res=0;
int r=0;
for(int i=1;i<=n;i++)
{
memset(que,0,sizeof(que));
for(int j=1;j<=n;j++)
if(Map[j][i])
{
if(j>1&&!Map[j-1][i])res=1;
que[++que[0]]=Map[j][i];
}
for(int j=1;j<=n;j++)
Map[j][i]=que[j];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(Map[j][i]==Map[j+1][i]&&Map[j][i])
{
res=1;
Map[j][i]<<=1;
Map[j+1][i]=0;
ans+=Map[j][i];
}
for(int i=1;i<=n;i++)
{
memset(que,0,sizeof(que));
for(int j=1;j<=n;j++)
if(Map[j][i])
{
if(j>1&&!Map[j-1][i])res=1;
que[++que[0]]=Map[j][i];
}
for(int j=1;j<=n;j++)
Map[j][i]=que[j];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(!Map[i][j])r++;
if(!r)return 0;
r=1+k%r;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(!Map[i][j])
{
r--;
if(!r){Map[i][j]=v;goto nxt;}
}
nxt:return res;
}
bool down(int k,int v)
{
bool res=0;
int r=0;
for(int i=1;i<=n;i++)
{
memset(que,0,sizeof(que));
for(int j=n;j;j--)
if(Map[j][i])
{
if(j<n&&!Map[j+1][i])res=1;
que[++que[0]]=Map[j][i];
}
int now=que[0];
reverse(que+1,que+que[0]+1);
for(int j=n;j;j--)
{
if(now)Map[j][i]=que[now--];
else Map[j][i]=0;
}
}
for(int i=1;i<=n;i++)
for(int j=n;j;j--)
if(Map[j][i]==Map[j-1][i]&&Map[j][i])
{
res=1;
Map[j][i]<<=1;
Map[j-1][i]=0;
ans+=Map[j][i];
}
for(int i=1;i<=n;i++)
{
memset(que,0,sizeof(que));
for(int j=n;j;j--)
if(Map[j][i])
{
if(j<n&&!Map[j+1][i])res=1;
que[++que[0]]=Map[j][i];
}
int now=que[0];
reverse(que+1,que+que[0]+1);
for(int j=n;j;j--)
{
if(now)Map[j][i]=que[now--];
else Map[j][i]=0;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(!Map[i][j])r++;
if(!r)return 0;
r=1+k%r;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(!Map[i][j])
{
r--;
if(!r){Map[i][j]=v;goto nxt;}
}
nxt:return res;
}
bool left(int k,int v)
{
bool res=0;
int r=0;
for(int i=1;i<=n;i++)
{
memset(que,0,sizeof(que));
for(int j=1;j<=n;j++)
if(Map[i][j])
{
if(j>1&&!Map[i][j-1])res=1;
que[++que[0]]=Map[i][j];
}
for(int j=1;j<=n;j++)
Map[i][j]=que[j];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(Map[i][j]==Map[i][j+1]&&Map[i][j])
{
res=1;
Map[i][j]<<=1;
Map[i][j+1]=0;
ans+=Map[i][j];
}
for(int i=1;i<=n;i++)
{
memset(que,0,sizeof(que));
for(int j=1;j<=n;j++)
if(Map[i][j])
{
if(j>1&&!Map[i][j-1])res=1;
que[++que[0]]=Map[i][j];
}
for(int j=1;j<=n;j++)
Map[i][j]=que[j];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(!Map[i][j])r++;
if(!r)return 0;
r=1+k%r;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(!Map[i][j])
{
r--;
if(!r){Map[i][j]=v;goto nxt;}
}
nxt:return res;
}
bool right(int k,int v)
{
bool res=0;
int r=0;
for(int i=1;i<=n;i++)
{
memset(que,0,sizeof(que));
for(int j=n;j;j--)
if(Map[i][j])
{
if(j<n&&!Map[i][j+1])res=1;
que[++que[0]]=Map[i][j];
}
int now=que[0];
reverse(que+1,que+que[0]+1);
for(int j=n;j;j--)
{
if(now)Map[i][j]=que[now--];
else Map[i][j]=0;
}
}
for(int i=1;i<=n;i++)
for(int j=n;j;j--)
if(Map[i][j]==Map[i][j-1]&&Map[i][j])
{
res=1;
Map[i][j]<<=1;
Map[i][j-1]=0;
ans+=Map[i][j];
}
for(int i=1;i<=n;i++)
{
memset(que,0,sizeof(que));
for(int j=n;j;j--)
if(Map[i][j])
{
if(j<n&&!Map[i][j+1])res=1;
que[++que[0]]=Map[i][j];
}
int now=que[0];
reverse(que+1,que+que[0]+1);
for(int j=n;j;j--)
{
if(now)Map[i][j]=que[now--];
else Map[i][j]=0;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(!Map[i][j])r++;
if(!r)return 0;
r=1+k%r;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(!Map[i][j])
{
r--;
if(!r){Map[i][j]=v;goto nxt;}
}
nxt:return res;
}
int main()
{
scanf("%d%d%d%d%d%d%d%d",&n,&m,&x,&y,&v,&x2,&y2,&v2);
Map[x][y]=v;Map[x2][y2]=v2;
for(int i=1;i<=m;i++)
{
int d,k,v;
scanf("%d%d%d",&d,&k,&v);
if(d==0)if(!up(k,v)){printf("%d\n%lld\n",i-1,ans);return 0;}
if(d==1)if(!down(k,v)){printf("%d\n%lld\n",i-1,ans);return 0;}
if(d==2)if(!left(k,v)){printf("%d\n%lld\n",i-1,ans);return 0;}
if(d==3)if(!right(k,v)){printf("%d\n%lld\n",i-1,ans);return 0;}
}
printf("%d\n%lld\n",m,ans);
return 0;
}
rp++
[CSP-S模拟测试]:小P的2048(模拟)的更多相关文章
- 「10.14」小P的2048(模拟)·小P的单调数列(性质,DP)·小P的生成树(乱搞)
A. 小P的2048 模拟.....又没啥可说的,以后要认真打打模拟题了... B. 小P的单调数列 考场$n^2log(n)$的SB思路有人听吗 正解当然不是这样, 事实上我们每次选取的只有一段区间 ...
- [CSP-S模拟测试]:小L的数(数位DP+模拟)
题目传送门(内部题132) 输入格式 第一行一个整数$t$. 接下来$t$行每行一个整数$n$. 输出格式 $t$行,每行一个整数表示答案. 样例 样例输入: 41818231232691052109 ...
- [CSP-S模拟测试]:小盆友的游戏(数学 or 找规律)
题目传送门(内部题110) 输入格式 第一行一个整数$N$,表示小盆友的个数. 第二行$N$个整数$A_i$,如果$A_i=-1$表示$i$目前是自由身,否则$i$是$A_i$的跟班. 输出格式 一个 ...
- [CSP-S模拟测试]:小P的生成树(数学+Kruskal)
题目描述 小$P$是个勤于思考的好孩子,自从学习了最大生成树后,他就一直在想:能否将边权范围从实数推广到复数呢?可是马上小$P$就发现了问题,复数之间的大小关系并没有定义.于是对于任意两个复数$z_1 ...
- [CSP-S模拟测试]:小P的单调数列(树状数组+DP)
题目描述 小$P$最近喜欢上了单调数列,他觉得单调的数列具有非常多优美的性质.经过小$P$复杂的数学推导,他计算出了一个单调增数列的艺术价值等于该数列中所有书的总和.并且以这个为基础,小$P$还可以求 ...
- [CSP-S模拟测试]:小奇的仓库(warehouse)(树形DP)
题目背景 小奇采的矿实在太多了,它准备在喵星系建个矿石仓库.令它无语的是,喵星系的货运飞船引擎还停留在上元时代! 题目描述 喵星系有$n$个星球,星球以及星球间的航线形成一棵树.从星球$a$到星球$b ...
- [CSP-S模拟测试]:小奇的矩阵(matrix)(DP+数学)
题目背景 小奇总是在数学课上思考奇怪的问题. 题目描述 给定一个$n\times m$的矩阵,矩阵中的每个元素$a_{i,j}$为正整数.接下来规定: $1.$合法的路径初始从矩阵左上角出发,每 ...
- [CSP-S模拟测试]:小奇挖矿2(DP+赛瓦维斯特定理)
题目背景 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿石交易市场,以便为飞船升级无限非概率引擎. 题目描述 现在有$m+1$个星球,从左到右标号为$0$到$n$,小奇最初 ...
- [CSP-S模拟测试]:小Y的图(最小生成树+LCA)
题目传送门(内部题131) 输入格式 第一行三个整数$n$.$m$和$Q$. 接下来$m$行每行三个整数$x$.$y$.$z$($1\leqslant x,y\leqslant n,1\leqslan ...
随机推荐
- docker私有仓库-harbor
简单说一下Harbor的部署,踩了几个坑,参考同事大神的配置文件,一脸懵逼的部署出来了,其中部分内容参考了网上一些大神的文档,本篇文章仅供参考学习,如有雷同,万分荣幸. 这篇文档仅限于centos7参 ...
- 第五周课程总结&实验报告(三)
实验三 String类的应用 实验目的 掌握类String类的使用: 学会使用JDK帮助文档: 实验内容 1.已知字符串:"this is a test of java".按要求执 ...
- JavaScript event对象clientX,offsetX,screenX异同
event对象是JavaScript中最重要的对象之一,他代表了各种事件的状态,在各种事件的事件处理中经常用到,比如键盘活动.鼠标活动等等,其中有几个对象官方说的比较模糊,很难理解,这里有必要通俗化的 ...
- 工作日记之查看Linux系统里面的启动频率2017_02_07
链接:http://www.jb51.net/LINUXjishu/19905.html 查看Linux里面的batch: cat /etc/crontab (1)0 19 * * 6 root /d ...
- I - The Values You Can Make (背包求具体方案)
题目大意 给你n个数,让你用这n个数在组成k的情况下,找到所有的value,这些value也由这n个数组成,且这些value组合在一起能够组成k 解法 看到题目我的想法就是母函数= =不过wa了,后来 ...
- redis持久化机制与过期策略
RDB的持久化策略 (快照方式,默认持久化方式): 按照规则定时将内存中的数据同步到磁盘,它有以下4个触发场景. 1. 自己配置的快照规则 vim /redis/bin/ redis.conf:按照 ...
- 剑指offer-树的子结构-python
题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 思路 空树不是任意一个树的子结构,如果 root1 与root2 中有一个为空树的话,返回 ...
- Vue 中如何定义全局的变量和常量
Vue 中如何定义全局的变量和常量 我想要定义一个变量, 在项目的任何地方都可以访问到, 不需要每一次使用的时候, 都引入. 尝试1:创建 global.js 并且在其中定义 let a = 10 ...
- 在Python中使用protobuf2.6.1 string format utf-8 and unicode error
版本信息: protobuf: v2.6.1 python: 2.7 关于在Python中使用protobuf时 string格式字段的编码问题 在python中编码格式多采用utf-8格式.而pro ...
- ES6初步学习
from:http://www.jianshu.com/p/287e0bb867ae 刚开始用vue或者react,很多时候我们都会把ES6这个大兄弟加入我们的技术栈中.但是ES6那么多那么多特性,我 ...