鹿见青山 2023-12-15 11:52 采纳率: 97.9%
浏览 8
已结题

pta 2048游戏模拟为什么不对


#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;}
  • 写回答

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;
    }
    

    这段代码首先将所有非零元素移动到数组的前面,然后将剩余的位置补零。然后,它会遍历数组,找到相同的元素并合并它们。如果发生了合并,它会将合并后的元素向前移动,并在数组的末尾补零。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月23日
  • 已采纳回答 12月15日
  • 修改了问题 12月15日
  • 创建了问题 12月15日

悬赏问题

  • ¥30 基于信创PC发布的QT应用如何跨用户启动后输入中文
  • ¥20 非root手机,如何精准控制手机流量消耗的大小,如20M
  • ¥15 远程安装一下vasp
  • ¥15 自己做的代码上传图片时,报错
  • ¥15 Lingo线性规划模型怎么搭建
  • ¥15 关于#python#的问题,请各位专家解答!区间型正向化
  • ¥15 unity从3D升级到urp管线,打包ab包后,材质全部变紫色
  • ¥50 comsol温度场仿真无法模拟微米级激光光斑
  • ¥15 上传图片时提交的存储类型
  • ¥15 VB.NET如何绘制倾斜的椭圆