DescriptionDescriptionDescription
此时,ConanConanConan却在一旁玩着204820482048。
这是一个4∗44*44∗4的矩阵,初始全为000。每次一个没有数字的格子中会随机出现一个222或444,每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,相同数字的方块在靠拢、相撞时会相加。
ConanConanConan想看看今天自己运气咋样,于是就闭着眼睛,在屏幕上随便滑来滑去。所以这个模拟的任务就交给你了。过了一会,他然后睁开眼睛,如果游戏没有结束(滑动后如果没有空格子,则游戏结束),请输出矩阵(格式参见样例),否则输出“Game“Game“Game over!”over!”over!”(不包含引号)。
InputInputInput
输入第一行包含一个整数N,表示ConanConanConan滑了几下。
接下来NNN行,x,y,v,fx, y, v, fx,y,v,f表示第xxx行与第yyy列出现数字为vvv后,ConanConanConan滑的方向为fff(fff为字符,U,D,L,RU, D, L, RU,D,L,R分别表示向上下左右滑)。
行从上往下1-4标号,列从左往右1-4标号。
数据保证在游戏未结束时,只会在空白区域出现数字。
OutputOutputOutput
输出按题目描述。
SampleInputSample InputSampleInput
8
1 3 4 L
2 3 2 U
2 4 2 R
4 1 2 L
3 4 2 L
3 2 2 D
1 3 4 R
1 3 2 U
SampleOutputSample OutputSampleOutput
0 0 2 8
0 0 0 2
0 0 0 8
0 0 0 0
ExplainExplainExplain
对于100%的数据满足。
TrainTrainTrain OfOfOf ThoughtThoughtThought
我们可以定一个双重循环和一个ttt,有以下四种情况:
1.往左滑:t=1(初值),枚举行,然后第二个循环枚举列,只要找到一个数就往左边移动到ttt的位置,然后本身清零,在判断是否能和t−1t-1t−1这个位置的合并
2.往右滑:t=4(初值),枚举行,然后第二个循环枚举列,只要找到一个数就往右边移动到ttt的位置,然后本身清零,在判断是否能和t+1t+1t+1这个位置的合并
3.往上滑,t=1(初值),枚举列,然后第二个循环枚举行,只要找到一个数就往上边移动到ttt的位置,然后本身清零,在判断是否能和t−1t-1t−1这个位置的合并
4.往下滑,t=4(初值),枚举列,然后第二个循环枚举行,只要找到一个数就往下边移动到ttt的位置,然后本身清零,在判断是否能和t+1t+1t+1这个位置的合并
详细见codecodecode
CodeCodeCode
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int a[1001][1001],n;
int x,y,z;
bool b[1001][1001],ppp;
void left()
{
for (int i=1; i<=4; ++i)
{
int t=1;
for (int j=1; j<=4; ++j)
if (a[i][j]!=0)
{
swap(a[i][j],a[i][t]);//移动到t
if (a[i][t-1]==a[i][t] && b[i][t-1]==0) a[i][t]=0,a[i][t-1]*=2,b[i][t-1]=1,t--;//看看是否能合并
++t;
}
}
if (a[1][4]!=0 && a[2][4]!=0 && a[3][4]!=0 && a[4][4]!=0) ppp=1;//判断游戏是否结束
}
void right()
{
for (int i=1; i<=4; ++i)
{
int t=4;
for (int j=4; j>=1; --j)
if (a[i][j]!=0)
{
swap(a[i][j],a[i][t]);//移动到t
if (a[i][t+1]==a[i][t] && b[i][t+1]==0) a[i][t]=0,a[i][t+1]*=2,b[i][t+1]=1,++t;//看看是否能合并
--t;
}
}
if (a[1][1]!=0 && a[2][1]!=0 && a[3][1]!=0 && a[4][1]!=0) ppp=1;
}
void up()
{
for (int i=1; i<=4; ++i){
int t=1;
for (int j=1; j<=4; ++j)
if (a[j][i]!=0)
{
swap(a[t][i],a[j][i]);//移动到t
if (a[t-1][i]==a[t][i] && b[t-1][i]==0) a[t][i]=0,a[t-1][i]*=2,b[t-1][i]=1,--t;//看看是否能合并
++t;
}
}
if (a[4][1]!=0 && a[4][2]!=0 && a[4][3]!=0 && a[4][4]!=0) ppp=1;
}
void down()
{
for (int i=1; i<=4; ++i){
int t=4;
for (int j=4; j>=1; --j)
if (a[j][i]!=0)
{
swap(a[t][i],a[j][i]);//意思同上
if (a[t+1][i]==a[t][i] && b[t+1][i]==0) a[t+1][i]*=2,a[t][i]=0,b[t+1][i]=1,++t;//同上
--t;
}
}
if (a[1][2]!=0 && a[1][4]!=0 && a[1][3]!=0 && a[1][1]!=0) ppp=1;
}
int main()
{
int tt;
char ch[1005];
scanf("%d",&n);
for (tt=1; tt<=n; ++tt)
{
scanf("%d%d%d ",&x,&y,&z);
a[x][y]=z;
scanf("%c",&ch[tt]);
if (ch[tt]=='L') left();
if (ch[tt]=='U') up();
if (ch[tt]=='D') down();
if (ch[tt]=='R') right();
if (ppp==1) break;
memset(b,0,sizeof(b));
}
if (ppp==1 && tt!=n) {printf("Game over!"); return 0;}
for (int i=1; i<=4; ++i) {
printf("\n");
for (int j=1; j<=4; ++j)
printf("%d ",a[i][j]);
}
}