字节2048笔试题
题目描述
2048的规则就不啰嗦了,值得一提的是笔试题里不需要随机产生新的数字
输入描述
输入第一行是用户按下的方向键,1 2 3 4 分别表示上 下 左 右
接下来是一个4*4的矩阵,空格分割,0代表该位置没有数字
输出描述
输出用户按下该方向键后的矩阵数字,忽略随机产生数字
示例1
输入
3
2 0 4 8
0 2 0 2
0 0 2 0
2 0 2 8
输出
2 4 8 0
4 0 0 0
2 0 0 0
4 8 0 0
解题思路
核心思路是写出4个方向的合并函数,但实际上我们可以只写任意方向的合并函数(这里以左为例),其他方向的操作只需要对矩阵做一定的旋转即可。
Tip: 比如向右旋转
只需要先把矩阵旋转180度
,然后向左合并
,再旋转180度
即可得到向右合并的结果
旋转函数定义:
void rotate(int jz[][N],int times)
{
int tmp[N][N];
memcpy(tmp,jz,sizeof(tmp));
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
jz[i][j] = tmp[N-1-j][i];
}
}
if(times>1)
rotate(jz,times-1);
}
左合并函数定义:
void mergeLeft(int jz[][N])
{
for(int l = 0;l<N;l++) //循环处理每一行
{
int *line = jz[l];
int j,k;
for(int i=0;i<N;i++)
{
j = i;
while(!line[j] && j<N) //从当前位置开始找到第一个不为空的位置
j++;
k=j+1;
while(!line[k