D e s c r i p t i o n Description Description
此时,
C
o
n
a
n
Conan
Conan却在一旁玩着
2048
2048
2048。
这是一个
4
∗
4
4*4
4∗4的矩阵,初始全为
0
0
0。每次一个没有数字的格子中会随机出现一个
2
2
2或
4
4
4,每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,相同数字的方块在靠拢、相撞时会相加。
C
o
n
a
n
Conan
Conan想看看今天自己运气咋样,于是就闭着眼睛,在屏幕上随便滑来滑去。所以这个模拟的任务就交给你了。过了一会,他然后睁开眼睛,如果游戏没有结束(滑动后如果没有空格子,则游戏结束),请输出矩阵(格式参见样例),否则输出
“
G
a
m
e
“Game
“Game
o
v
e
r
!
”
over!”
over!”(不包含引号)。
I n p u t Input Input
输入第一行包含一个整数N,表示
C
o
n
a
n
Conan
Conan滑了几下。
接下来
N
N
N行,
x
,
y
,
v
,
f
x, y, v, f
x,y,v,f表示第
x
x
x行与第
y
y
y列出现数字为
v
v
v后,
C
o
n
a
n
Conan
Conan滑的方向为
f
f
f(
f
f
f为字符,
U
,
D
,
L
,
R
U, D, L, R
U,D,L,R分别表示向上下左右滑)。
行从上往下1-4标号,列从左往右1-4标号。
数据保证在游戏未结束时,只会在空白区域出现数字。
O u t p u t Output Output
输出按题目描述。
S a m p l e I n p u t Sample Input SampleInput
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
S a m p l e O u t p u t Sample Output SampleOutput
0 0 2 8
0 0 0 2
0 0 0 8
0 0 0 0
E x p l a i n Explain Explain
对于100%的数据满足。
T r a i n Train Train O f Of Of T h o u g h t Thought Thought
我们可以定一个双重循环和一个
t
t
t,有以下四种情况:
1.往左滑:t=1(初值),枚举行,然后第二个循环枚举列,只要找到一个数就往左边移动到
t
t
t的位置,然后本身清零,在判断是否能和
t
−
1
t-1
t−1这个位置的合并
2.往右滑:t=4(初值),枚举行,然后第二个循环枚举列,只要找到一个数就往右边移动到
t
t
t的位置,然后本身清零,在判断是否能和
t
+
1
t+1
t+1这个位置的合并
3.往上滑,t=1(初值),枚举列,然后第二个循环枚举行,只要找到一个数就往上边移动到
t
t
t的位置,然后本身清零,在判断是否能和
t
−
1
t-1
t−1这个位置的合并
4.往下滑,t=4(初值),枚举列,然后第二个循环枚举行,只要找到一个数就往下边移动到
t
t
t的位置,然后本身清零,在判断是否能和
t
+
1
t+1
t+1这个位置的合并
详细见
c
o
d
e
code
code
C o d e Code Code
#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]);
}
}