刷蓝桥杯碰到的,觉得有必要另写一篇文章
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
| import java.util.Arrays; import java.util.Scanner; public class Main { static char[][] matrix = new char[5][]; static char[][] backUp = new char[5][]; static void readMatrix(Scanner scan) { String tmp = scan.nextLine(); for(int i = 0; i < 5; i++) { matrix[i] = scan.nextLine().toCharArray(); backUp[i] = Arrays.copyOf(matrix[i], matrix[i].length); } } static void flip(int x, int y) { if(matrix[x][y] == '0') { matrix[x][y] = '1'; } else { matrix[x][y] = '0'; } } static void changeMatrix(int x, int y) { if(x - 1 >= 0) flip(x - 1, y); if(y - 1 >= 0) flip(x, y - 1); if(y + 1 <= 4) flip(x, y + 1); if(x + 1 <= 4) flip(x + 1, y); flip(x, y); } public static void main(String[] args) { Scanner scan = new Scanner(System.in); int n = scan.nextInt(); int count = 0; for(int i = 0; i < n; i++) { readMatrix(scan); System.out.println("初始化矩阵为:"); for(int j = 0; j < 5; j++) { System.out.println(matrix[j]); } int minChange = Integer.MAX_VALUE; for(int j = 0; j < 32; j++) { count = 0; String tmpString = String.format("%5s", Integer.toBinaryString(j)).replace(' ', '0'); System.out.format("第一行的开关状态为:%s\n", tmpString); System.out.print("第一行现在状态:"); System.out.println(matrix[0]); for(int k = 0; k < 5; k++) { if(tmpString.charAt(k) == '1') { changeMatrix(0, k); System.out.format("按下开关%d, 第一行现在状态 ", k + 1); System.out.println(matrix[0]); count++; } } System.out.println("开关按完后第一行现在的状态:"); System.out.println(matrix[0]); for(int a = 0; a < 4; a++) { for(int b = 0; b < 5; b++) { if(matrix[a][b] == '0') { changeMatrix(a + 1, b); count++; } } System.out.format("经过第%d行后的状态\n", a+1); for(int c = 0; c < 5; c++) { System.out.println(matrix[c]); } } boolean flag = true; for(int k = 0; k < 5; k++) { if(matrix[4][k] == '0') { flag = false; break; } } if(flag) { minChange = Math.min(count, minChange); } matrix = Arrays.copyOf(backUp, backUp.length); System.out.println("backUp数组是:"); for(int a = 0; a < 5; a++) { System.out.println(backUp[a]); } } if(count <= 6) System.out.println(count); else System.out.println(-1); } } }
|
很逆天的一个问题
比如原数组是
1 2 3 4 5
| 00111 01011 10001 11010 11100
|
第一次将backUp数组拷贝回原数组时,
1 2 3 4 5 6
| backUp数组是: 00111 01011 10001 11010 11100
|
第二次就做妖了
1 2 3 4 5
| 11111 11111 11111 11111 00100
|
出问题的代码是这里,将backUp拷贝回matrix时
1
| matrix = Arrays.copyOf(backUp, backUp.length);
|
受影响的表现是修改matrix的时候,backUp也会被改变
改为下面后就正常
1 2 3
| for(int a = 0; a < 5; a++) { matrix[a] = Arrays.copyOf(backUp[a], backUp[a].length); }
|
首先明确的是System.arraycopy和Arrays.copyOf,如果拷贝的对象是基本数据类型,则是深拷贝,而对于引用数据类型则是浅拷贝
拷贝对象是基本数据类型

拷贝对象是引用数据类型,比如int[](虽然是二维数组之间的拷贝,但是拷贝对象是int[])
