此时,
却在一旁玩着
。
这是一个
的矩阵,初始全为
。每次一个没有数字的格子中会随机出现一个
或
,每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,相同数字的方块在靠拢、相撞时会相加。
想看看今天自己运气咋样,于是就闭着眼睛,在屏幕上随便滑来滑去。所以这个模拟的任务就交给你了。过了一会,他然后睁开眼睛,如果游戏没有结束(滑动后如果没有空格子,则游戏结束),请输出矩阵(格式参见样例),否则输出
(不包含引号)。
输入第一行包含一个整数N,表示
滑了几下。
接下来
行,
表示第
行与第
列出现数字为
后,
滑的方向为
(
为字符,
分别表示向上下左右滑)。
行从上往下1-4标号,列从左往右1-4标号。
数据保证在游戏未结束时,只会在空白区域出现数字。
输出按题目描述。
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
0 0 2 8
0 0 0 2
0 0 0 8
0 0 0 0
对于100%的数据满足。
我们可以定一个双重循环和一个
,有以下四种情况:
1.往左滑:t=1(初值),枚举行,然后第二个循环枚举列,只要找到一个数就往左边移动到
的位置,然后本身清零,在判断是否能和
这个位置的合并
2.往右滑:t=4(初值),枚举行,然后第二个循环枚举列,只要找到一个数就往右边移动到
的位置,然后本身清零,在判断是否能和
这个位置的合并
3.往上滑,t=1(初值),枚举列,然后第二个循环枚举行,只要找到一个数就往上边移动到
的位置,然后本身清零,在判断是否能和
这个位置的合并
4.往下滑,t=4(初值),枚举列,然后第二个循环枚举行,只要找到一个数就往下边移动到
的位置,然后本身清零,在判断是否能和
这个位置的合并
详细见
#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]);
}
}