題目來源:小Hi小Ho的驚天大做戰:掃雷·一java
解題思路:由於只要肯定了第一個是否有地雷就能夠推算出後面是否有地雷(要麼爲0,要麼爲1,若是不是這兩個值就說明這個方案行不通),若是兩種可能中有一種成功,只須要計算包含有多少個1和多少個0,若是兩種可能都成功了,都爲1的纔是有雷,都爲0的纔是沒有地雷。算法
具體算法(java版,能夠直接AC)spa
1 import java.util.Scanner; 2 3 public class Main { 4 5 public static boolean flag1 = true;//當第一個爲1(有雷)時,依次推算後的結果 6 public static boolean flag2 = true;//當第一個爲0(沒雷)時,依次推算後的結果 7 8 public static void solve(int[] maze, int[][] mine, int N) { 9 mine[0][1] = 1;//第一個有雷 10 mine[1][1] = 0;//第一個沒雷 11 12 for (int i = 2; i <= N; i++) { 13 if (flag1) { 14 mine[0][i] = maze[i - 1] - mine[0][i - 1] - mine[0][i - 2]; 15 //要麼有雷,要麼沒雷 16 if (mine[0][i] == 1 || mine[0][i] == 0) { 17 flag1 = true; 18 } else { 19 flag1 = false;//推算失敗 20 break; 21 } 22 } 23 } 24 25 for (int i = 2; i <= N; i++) { 26 if (flag2) { 27 mine[1][i] = maze[i - 1] - mine[1][i - 1] - mine[1][i - 2]; 28 if (mine[1][i] == 1 || mine[1][i] == 0) { 29 flag2 = true; 30 } else { 31 flag2 = false; 32 break; 33 } 34 } 35 } 36 if (flag1) {//驗證最後一個是否正確 37 if (maze[N] != mine[0][N - 1] + mine[0][N]) { 38 flag1 = false; 39 } 40 } 41 if (flag2) { 42 if (maze[N] != mine[1][N - 1] + mine[1][N]) { 43 flag2 = false; 44 } 45 } 46 } 47 48 public static void main(String[] args) { 49 Scanner scanner = new Scanner(System.in); 50 int task = scanner.nextInt(); 51 while (task > 0) { 52 task--; 53 int N = scanner.nextInt(); 54 int[] maze = new int[N + 1]; 55 int[][] mine = new int[2][N + 1]; 56 for (int i = 1; i <= N; i++) { 57 maze[i] = scanner.nextInt(); 58 } 59 flag1 = flag2 = true; 60 solve(maze, mine, N); 61 int hasMine = 0, noMine = 0;//統計有雷和沒雷的數量 62 int[] hasMineAns = new int[N]; 63 int[] noMineAns = new int[N]; 64 if (flag1 && flag2) {//兩種可能都成功 65 for (int i = 1; i <= N; i++) { 66 if (mine[0][i] == 1 && mine[1][i] == 1) {//同時爲1(有雷) 67 hasMineAns[hasMine++] = i; 68 } else if (mine[0][i] == 0 && mine[1][i] == 0) {//同時爲0(沒雷) 69 noMineAns[noMine++] = i; 70 } 71 } 72 } else if (flag1 && !flag2) {//其中一種多是成功的,另一種失敗 73 for(int i=1;i<=N;i++){ 74 if(mine[0][i]==1){ 75 hasMineAns[hasMine++] = i; 76 }else{ 77 noMineAns[noMine++] = i; 78 } 79 } 80 } else if (!flag1 && flag2) { 81 for(int i=1;i<=N;i++){ 82 if(mine[1][i]==1){ 83 hasMineAns[hasMine++] = i; 84 }else{ 85 noMineAns[noMine++] = i; 86 } 87 } 88 } 89 System.out.print(String.format("%d", hasMine)); 90 for(int i=0;i<hasMine;i++){ 91 System.out.print(String.format(" %d", hasMineAns[i])); 92 } 93 System.out.print(String.format("\n%d", noMine)); 94 for(int i=0;i<noMine;i++){ 95 System.out.print(String.format(" %d", noMineAns[i])); 96 } 97 System.out.println(); 98 } 99 scanner.close(); 100 } 101 }