题目
1、手指向一个方向滑动,所有格子会向那个方向运动。
2、相同数字的两个格子,相撞时数字会相加。
输入描述:
1、输入为一个3 * 3的矩阵。
2、接下来输入一个1~4的数字。1表示向上滑动,2表示向下划动,3表示向左滑动,4表示向右滑动。
输出描述:
输出操作后的矩阵。
分析
这题考查的是对二维数组的操作,操作有四种类型,需要对遍历数组的方式进行区分。需要注意的地方有,整个数组会在滑动中移动,如果存在0则会被填充和覆盖,另外,相同的数字也会合并,如果合并后和后面的数组相同,则会继续合并。在处理这合并和移动操作时,我采用的方式是用一个列表来保存数组某一维中的非0数据,接下来对列表执行删除或添加数据的操作,忽略那些为0的值,操作结束之后再向数组中赋值(别忘记补0)。四种操作有相似性,关键是控制好i和j (i和j这里表示遍历二维数组的下标)的顺序以及前移的方向。
代码实现(Java)
import java.util.ArrayList;
import java.util.Scanner;
public class Main{
static ArrayList<String> list = new ArrayList<>();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[][] x = new int[3][3];
for(int j = 0; j < 3; j++) {
for(int i = 0; i < 3; i++) {
x[i][j] = sc.nextInt();
}
}
int a = sc.nextInt();
find(x, a);
for(int j = 0; j < 3; j++) {
for (int i = 0; i < 3; i++) {
System.out.print(x[i][j] + " ");
}
System.out.println();
}
}
public static void find(int[][] x, int a) {
switch (a) {
case 1:
for(int i = 0; i < 3