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

    原题地址

    没有复杂算法,就是麻烦,写起来细节比较多,比较考验细心,一次AC好开心。

    代码:

      1 #include <iostream>
      2 #include <vector>
      3 #include <cstring>
      4 #include <cstdlib>
      5 
      6 using namespace std;
      7 
      8 #define SIZE 400
      9 
     10 int N, M;
     11 int map[SIZE][SIZE];
     12 int res[SIZE][SIZE];
     13 
     14 vector<pair<int, int> > unknown_neighbors(int i, int j) {
     15   vector<pair<int, int> > nbs;
     16 
     17   for (int ii = -1; ii < 2; ii++)
     18     for (int jj = -1; jj < 2; jj++) {
     19       int r = ii + i;
     20       int c = jj + j;
     21       if (r >= 0 && r < N && c >= 0 && c < M && (r != i || c != j) && map[r][c] < 0)
     22         nbs.push_back(pair<int, int>(r, c));
     23     }
     24 
     25   return nbs;
     26 }
     27 
     28 vector<pair<int, int> > known_counterparts(int i, int j) {
     29   vector<pair<int, int> > cps;
     30 
     31   for (int ii = -2; ii < 3; ii++) {
     32     for (int jj = -2; jj < 3; jj++) {
     33       int r = ii + i;
     34       int c = jj + j;
     35       if (r >= 0 && r < N && c >= 0 && c < M && (r != i || c != j) && map[r][c] >= 0)
     36         cps.push_back(pair<int, int>(r, c));
     37     }
     38   }
     39 
     40   return cps;
     41 }
     42 
     43 vector<pair<int, int> > differ(vector<pair<int, int> > &a, vector<pair<int, int> > &b) {
     44   vector<pair<int, int> > diff;
     45   int count = 0;
     46 
     47   for (auto pa : a) {
     48     bool found = false;
     49     for (auto pb : b) {
     50       if (pb == pa) {
     51         found = true;
     52         count++;
     53         break;
     54       }
     55     }
     56     if (!found)
     57       diff.push_back(pa);
     58   }
     59 
     60   if (count < b.size())
     61     diff.clear();
     62 
     63   return diff;
     64 }
     65 
     66 void merge_pos(int i, int j, int v) {
     67   if (res[i][j] == -1 || res[i][j] == v)
     68     res[i][j] = v;
     69   else
     70     res[i][j] = -2;
     71 }
     72 
     73 void solve() {
     74   for (int i = 0; i < N; i++)
     75     for (int j = 0; j < M; j++) {
     76       if (map[i][j] == 0) {
     77         vector<pair<int, int> > nbs = unknown_neighbors(i, j);
     78         for (auto p : nbs)
     79           merge_pos(p.first, p.second, 0);
     80       }
     81       else if (map[i][j] > 0) {
     82         vector<pair<int, int> > nbs = unknown_neighbors(i, j);
     83         if (nbs.size() == map[i][j]) {
     84           for (auto p : nbs)
     85             merge_pos(p.first, p.second, 1);
     86           continue;
     87         }
     88 
     89         vector<pair<int, int> > cps = known_counterparts(i, j);
     90         for (auto p : cps) {
     91           vector<pair<int, int> > cp_nbs = unknown_neighbors(p.first, p.second);
     92           if (nbs.size() <= cp_nbs.size() || map[i][j] <= map[p.first][p.second])
     93             continue;
     94           vector<pair<int, int> > diff = differ(nbs, cp_nbs);
     95           if ((int) (nbs.size() - cp_nbs.size()) == map[i][j] - map[p.first][p.second] && !diff.empty())
     96             for (auto dp : diff)
     97               merge_pos(dp.first, dp.second, 1);
     98         }
     99       }
    100     }
    101 }
    102 
    103 int main() {
    104   int n;
    105 
    106   cin >> n;
    107   while (n--) {
    108     cin >> N >> M;
    109     for (int i = 0; i < N; i++)
    110       for (int j = 0; j < M; j++)
    111         cin >> map[i][j];
    112     memset(res, -1, SIZE * SIZE * sizeof(int));
    113 
    114     solve();
    115 
    116     int mine = 0;
    117     int not_mine = 0;
    118 
    119     for (int i = 0; i < N; i++)
    120       for (int j = 0; j < M; j++) {
    121         mine += (res[i][j] == 1 ? 1 : 0);
    122         not_mine += (res[i][j] == 0 ? 1 : 0);
    123       }
    124 
    125     cout << mine << " " << not_mine << endl;
    126   }
    127 
    128   return 0;
    129 }
  • 相关阅读:
    洛谷-P5357-【模板】AC自动机(二次加强版)
    洛谷-P3796-【模板】AC自动机(加强版)
    洛谷-P3808-【模板】AC自动机(简单版)
    2020 CCPC Wannafly Winter Camp Day2-K-破忒头的匿名信
    zabbix的搭建
    playbook 介绍
    ansible 模块
    shell 脚本判断ip
    shell 脚本安装lnmp
    expect 介绍
  • 原文地址:https://www.cnblogs.com/boring09/p/4357340.html
Copyright © 2011-2022 走看看