hihoCoder 1114 小Hi小Ho的驚天大做戰:掃雷·一 最詳細的解題報告

題目來源:小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 }
相關文章
相關標籤/搜索