zoukankan      html  css  js  c++  java
  • hihoCoder#1114 小Hi小Ho的惊天大作战:扫雷·一

    原题地址

    回溯+搜索

    枚举每个位置上能否放地雷,当第i个位置枚举完成后,第i-1个位置的情况就确定了,此时,检查第i-1个位置是否满足要求,即左右间隔为1的范围内地雷数是否等于申明数字,如果满足条件,那么继续搜索下去,如果不满足条件,抛弃这个搜索分支。

    搜索完成后,将所有可行解按位置“与”一下 ,找到那些一定为地雷或一定为空的格子。

    最后输出即可。

    代码:

     1 #include <iostream>
     2 #include <cstring>
     3 
     4 using namespace std;
     5 
     6 void merge(int *t, int *r, int n) {
     7   for (int i = 0; i < n; i++) {
     8     if (t[i] == -1 || t[i] == r[i])
     9       t[i] = r[i];
    10     else
    11       t[i] = -2;
    12   }
    13 }
    14 
    15 void find(int *a, int *r, int *t, int p, int n) {
    16   if (p >= n) {
    17     if ((n == 1 && a[p - 1] == r[p - 1])
    18         || ((n > 1) && a[p - 1] == r[p - 1] + r[p - 2]))
    19       merge(t, r, n);
    20   }
    21   else if (p == 0) {
    22     for (int i = 0; i < 2; i++) {
    23       r[p] = i;
    24       find(a, r, t, p + 1, n);
    25     }
    26   }
    27   else if (p == 1) {
    28     for (int i = 0; i < 2; i++) {
    29       r[p] = i;
    30       if (a[p - 1] == r[p - 1] + r[p])
    31         find(a, r, t, p + 1, n);
    32     }
    33   }
    34   else {
    35     for (int i = 0; i < 2; i++) {
    36       r[p] = i;
    37       if (a[p - 1] == r[p] + r[p - 1] + r[p - 2])
    38         find(a, r, t, p + 1, n);
    39     }
    40   }
    41 }
    42 
    43 int main() {
    44   int n;
    45 
    46   cin >> n;
    47   while (n--) {
    48     int N;
    49     cin >> N;
    50     int *a = new int[N];
    51     int *r = new int[N];
    52     int *t = new int[N];
    53 
    54     for (int i = 0; i < N; i++)
    55       cin >> a[i];
    56     memset(r, 0, N * sizeof(int));
    57     memset(t, -1, N * sizeof(int));
    58 
    59     find(a, r, t, 0, N);
    60 
    61     int mine = 0;
    62     int not_mine = 0;
    63 
    64     for (int i = 0; i < N; i++) {
    65       mine += (t[i] == 1 ? 1 : 0);
    66       not_mine += (t[i] == 0 ? 1 : 0);
    67     }
    68 
    69     cout << mine;
    70     for (int i = 0; i < N; i++)
    71       if (t[i] == 1)
    72         cout << " " << i + 1;
    73     cout << endl;
    74 
    75     cout << not_mine;
    76     for (int i = 0; i < N; i++)
    77       if (t[i] == 0)
    78         cout << " " << i + 1;
    79     cout << endl;
    80 
    81     delete t;
    82     delete r;
    83     delete a;
    84   }
    85 
    86   return 0;
    87 }
  • 相关阅读:
    C#的访问修饰符
    C#的数据类型
    iOS--小结系列八(继续)
    ios--小结系列八 控制器管理
    ios--小结系列八 程序启动原理
    ios--小结系列七 通知机制
    ios--小结系列六继续-UITableViewCell
    ios--小结系列六
    ios--小结系列五
    ios--小结系列四
  • 原文地址:https://www.cnblogs.com/boring09/p/4356802.html
Copyright © 2011-2022 走看看