题目描述:
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~