#include <stdio.h>
int main(){
int arr[4];
for(int i=0;i<4;i++)
scanf("%d",&arr[i]);
for(int k=0;k<3;k++) //这一层循环是为了防止遗漏做的检查 {
for(int i=0;i<3;i++) //不用看最后一位
{ if(arr[i]==0) //找到0
{ arr[i]=arr[i+1]; //进行移位 }
arr[3]=0; //关于此处为什么总是最后一个元素置0,是因为在移位时将是0的那一位移到了前面,这个位置悬空了
}
} //以上操作使得0全部移到了最后
//接下来就是合并
for(int i=0;i<3;i++)
{ if(arr[i]==arr[i+1]&&arr[i]!=0)
{
arr[i]+=arr[i+1];
for(int j=i+1;j<3;j++)
arr[j]=arr[j+1]; //移位
arr[3]=0; //置0原理同上
} }
for(int i=0;i<4;i++)
printf("%d ",arr[i]);
return 0;}
pta 2048游戏模拟为什么不对
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- 刘家旺1 2023-12-15 11:58关注
该回答引用GitHub Copilot:你的代码中存在一些问题,主要是在合并相同数字时,你只考虑了当前数字和下一个数字,但是如果下一个数字是0,你需要继续向后查找,直到找到一个非零的数字或者到达数组的末尾。此外,你的代码只进行了一次合并,但是在一次操作中,可能需要进行多次合并。
以下是修改后的代码:
#include <stdio.h> void move_and_merge(int* arr, int size) { int i, j, k; // 移动非零元素到前面 for (i = 0, j = 0; j < size; ++j) { if (arr[j] != 0) { arr[i++] = arr[j]; } } // 剩余位置补零 for (; i < size; ++i) { arr[i] = 0; } // 合并相同的元素 for (i = 0; i < size - 1; ++i) { if (arr[i] != 0 && arr[i] == arr[i + 1]) { arr[i] *= 2; // 合并后的元素向前移动 for (k = i + 1; k < size - 1; ++k) { arr[k] = arr[k + 1]; } arr[size - 1] = 0; } } } int main() { int arr[4]; for (int i = 0; i < 4; ++i) { scanf("%d", &arr[i]); } move_and_merge(arr, 4); for (int i = 0; i < 4; ++i) { printf("%d ", arr[i]); } return 0; }
这段代码首先将所有非零元素移动到数组的前面,然后将剩余的位置补零。然后,它会遍历数组,找到相同的元素并合并它们。如果发生了合并,它会将合并后的元素向前移动,并在数组的末尾补零。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥30 基于信创PC发布的QT应用如何跨用户启动后输入中文
- ¥20 非root手机,如何精准控制手机流量消耗的大小,如20M
- ¥15 远程安装一下vasp
- ¥15 自己做的代码上传图片时,报错
- ¥15 Lingo线性规划模型怎么搭建
- ¥15 关于#python#的问题,请各位专家解答!区间型正向化
- ¥15 unity从3D升级到urp管线,打包ab包后,材质全部变紫色
- ¥50 comsol温度场仿真无法模拟微米级激光光斑
- ¥15 上传图片时提交的存储类型
- ¥15 VB.NET如何绘制倾斜的椭圆