当前位置: 首页 > 工具软件 > 2048.c > 使用案例 >

#4.2048

屠和洽
2023-12-01

题目描述:

2048 游戏是以 2+2=4 数学原理为基本原理的游戏,玩法如下:每次向某个方向移动数字方格,使所有的数字方格朝着你移动的方向移动,然后系统会在空白的地方随机生成一个数字方格,相同数字大小的方格相互碰撞会融合,当游戏相加为 2048 时游戏便胜利了。

现在,蜗蜗发明了一种简易版本的 2048 玩法,只能合并一次数字,有一个 n×n 的方阵,每个位置(方块)对应的数字也都知道,并且每个位置上对应的数字一定都是 2 的幂次。一次合并,可以选择向左、向右、向上或者向下合并,以向左合并为例,方阵中的所有方块都会向左移动直到不能移动为止,其中,如果有两个相同数字的方块在这个方向上相遇,那么这两个方块就会合并,只留下一个新的方块,这个新的方块的值为原本两个方块的值的和,这样的合并只会发生一轮(可能同时在不同的地方会有多对方块合并),不会产生连锁反应。

例如对于某一行

2 2 4

向左合并后,会变成

4 4 0

其中 0 表示没有方块。注意:原本第二个位置上的 2 在向左的过程当中遇到了第一个位置上的 2,它们相等,于是合并成了 4(4=2+2),并且保留在了更左边的位置(其实位置并不关键),原本最右边的 4 因为前面一个方块的消失会跟着往左移动一格。这时候合并就完成了,之后,第一个位置上的 4 并不会和第二个位置上的 4 再次合并产生 8。

如果有超过 3 个以上的相同方块可以合并,会优先合并这个方向上最靠近边界的两个方块。

例如对于某一行

2 2 2

向左合并后,会变成

4 2 0

再例如这个方阵:

8 8
4 4

向上合并不会有任何变化,因为向上运动的时候,方块们不会遇到和自己一样的方块(第一行的两个 8 上不去,左边的 4 上去遇到 8,不相等,不会合并,右边的 4 上去遇到 8,也不会合并。这两个 8 不会合并,是因为它们向上运动,不会相遇)。但是如果向左或者向右合并会变化,因为两个 8会相遇合并变成 16,两个 4 会相遇合并变成 8(多对方块可以同时合并)。

请问,经过一次操作产生合并之后,能得到的最大的数是多少?请输出这个数。

输入格式:

第一行一个正整数 n。

接下来 n 行,每行 n 个以空格隔开的数字,表示方阵。

输出格式:

一行,一个数字,表示最后的结果。

样例:

输入:

3
2 2 8
4 2 8
4 4 2

输出:

16

样例解释:

向上或者向下合并都会得到这个结果,如果向上合并,合并后的方阵如下:

2 4 16
8 4 2
0 0 0

数据范围:

对于100%的数据,保证2≤n≤1000。

题目保证每个位置上的数一定都是 2 的幂次, 且小于 2048。


欸,我的代码呢(water)?

#include<bits/stdc++.h>
using namespace std;
const int N=1005;//定义1001会数组越界,吃一发RE

int a[N][N];
int n;
int maxid;//遍历n*n的方阵中的最大值

int main()
{
	scanf("%d",&n);//输入n
	for (int i=1;i<=n;i++)
	{
		for (int j=1;j<=n;j++)
		{
			scanf("%d",&a[i][j]);//输入方阵
		}
	}
	maxid=0;
	for (int i=1;i<=n;i++)
	{
		for (int j=1;j<=n;j++)
		{
			if (a[i][j]>maxid)
			{
				maxid=a[i][j];
			}
			if (a[i][j]==a[i][j+1] && a[i][j]+a[i][j+1]>maxid)//可合并
			{
				maxid=a[i][j]*2;//在maxid的右or下,遍历相同值
			}
			if (a[i][j]==a[i+1][j] && a[i][j]+a[i+1][j]>maxid)//可合并
			{
				maxid=a[i][j]*2;//另两方向(左or上)
			}
		}
	}
	printf("%d",maxid);//输出
	return 0;
}

bye~

 类似资料:

相关阅读

相关文章

相关问答