【算法】小米9.11笔试:《2048》

《2048》是一款热门的数字游戏。游戏中,每个方块上的数字都有2的幂,数字方块会根据指令整体进行上下左右移动,如果两个数字相同的方块在移动中碰撞,他们就会合成一个新的方块。例如下图为4*4格子的游戏,0表示格子为空,图a为移动前格子中的数字,图b为图a左移后的结果:
输入
0 0 2 4
0 2 2 2
0 4 2 2
8 8 2 2
输出
2 4 0 0
4 2 0 0
4 4 0 0
16 4 0 0

问,给定n*m的矩阵M,0表示空格子,非0整数表示待移动的数字,按照2048的移动规则,输出进行左移操作后的矩阵结果。

输入
输入n行数据
第1行为矩阵行数
第2行到第n行为矩阵每行数据,m个数据用空格隔开

输出
输出左移后的矩阵,单行元素用空格隔开,换行处无空格

样例输入
4
0 0 2 4
0 2 2 2
0 4 2 2
8 8 2 2
样例输出
2 4 0 0
4 2 0 0
4 4 0 0
16 4 0 0

我的思路是将矩阵保存到二维数组,遍历每行相邻元素相等,即累加到前一位,后一位置0,之后将非零元素前移即可

package p6;

/**
 * @author dustdawn
 * @date 2019/9/11 19:00
 */

import java.util.Scanner;

public class Main {


    /*请完成下面这个函数,实现题目要求的功能
    当然,你也可以不按照下面这个模板来作答,完全按照自己的想法来 ^-^
    ******************************开始写代码******************************/
    static String solution(String[] input,int _input_size) {


        int[][] ints = new int[_input_size][];
        for (int i=0; i < input.length; i++){
            String[] split = input[i].split(" ");
            ints[i] = new int[split.length];
            for (int j = 0; j < split.length; j++) {
                //System.out.println(split[i]);
                //int k = Integer.parseInt(split[j]);
                ints[i][j] = Integer.parseInt(split[j]);
            }
        }
        for (int i = 0; i < ints.length; i++) {
            for (int j = 0; j < ints[i].length-1; j++) {
                if (ints[i][j] == ints[i][j+1]) {
                    ints[i][j] *= 2;
                    ints[i][j+1] = 0;
                }
            }
        }

        for (int i = 0; i < ints.length; i++) {
            int index = 0;
            int[] re = new int[ints[i].length];
            for (int j = 0; j < ints[i].length; j++) {
                if (ints[i][j] != 0) {
                    re[index] = ints[i][j];
                    index++;
                   }
                }
            int dec = ints[i].length-index;
            for (int j = dec, k = 1; j > 0; j--, k++) {
                re[ints.length-k] = 0;
            }
            ints[i] = re;
        }

        StringBuffer sb = new StringBuffer();
        for(int i=0;i<ints.length;i++){
            for (int j = 0; j < ints[i].length; j++) {
                sb.append(ints[i][j] + " ");
            }
            sb.append("\n");
        }

        return sb.toString();


    }
    /******************************结束写代码******************************/


    public static void main(String[] args){

        Scanner in = new Scanner(System.in);
        String res;

        int _input_size = 0;
        _input_size = Integer.parseInt(in.nextLine().trim());
        String[] _input = new String[_input_size];
        String _input_item;
        for(int _input_i = 0; _input_i < _input_size; _input_i++) {
            try {
                _input_item = in.nextLine();
            } catch (Exception e) {
                _input_item = null;
            }
            _input[_input_i] = _input_item;
        }

        res = solution(_input,_input_size);
        System.out.println(res);
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值