当前位置: 代码迷 >> 综合 >> 【算法】小米9.11笔试:《2048》
  详细解决方案

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

热度:6   发布时间:2023-11-25 21:26:51.0

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