【模拟】2048

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 44的矩阵,初始全为 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 t1这个位置的合并
2.往右滑:t=4(初值),枚举行,然后第二个循环枚举列,只要找到一个数就往右边移动到 t t t的位置,然后本身清零,在判断是否能和 t + 1 t+1 t+1这个位置的合并
3.往上滑,t=1(初值),枚举列,然后第二个循环枚举行,只要找到一个数就往上边移动到 t t t的位置,然后本身清零,在判断是否能和 t − 1 t-1 t1这个位置的合并
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]);
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值