这里贴下不用枚举方格是否为雷的方法
a表示输入标号,初始值为-1代表未探知
b表示当前格子是否有雷,初始化为0,0表示未探知,1表示探知肯定有雷,2表示探知肯定无雷(我也不知道为什么不初始化为-1,作死。。。)
。。。二是个坑啊,不能用多余的想法解题。。。也就是3个条件不能互影响,不能用别的条件得出来的b的值,大概就是全写成通过a的值来判断
一二三都是通过数字和周边已经确定的雷数的关系来的,比如数字为5,周边肯定5个雷,3个无雷,也用了集合包含来判断
二三中队列跳出的条件就是一轮下来,所有的未解决的数量都没发生变化
那么接着弄也不会有变化了。
有按更新周围格子不断更新外围可能修改的进行优化,也有按剩余探索格子数的优先队列进行优化

#include <cstdio>
#include <memory>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <vector>
#include <cassert>
#include <string>
#include <ctime>
#include <map>
#include <queue>
#include <algorithm>
#include <iostream>
#include <cassert>
#include <stack>
using namespace std;
#define REP(i,n) for(int i=0;i<n;i++)
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define req(i,a,b) for(int i=a;i>=b;i--)
#define rp(i,a) for(int i=head[a];i+1;i=edge[i].next)
#define cl(a,b) memset(a,b,sizeof a);
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define mod 1000000007
const int inf = ~0u >> 2;
const ll INF = (1LL << 62) - 1;
double eps = 1e-9;
const int N = 1e6 + 5;
const int M = 221;int ans = 0, cnt = 0;
int n, m;
char str[M];
int a[N],b[N];void getsure() {for (int i = 3; i <= n; i+=3) {b[i] = (a[i-1] - a[i - 2]+(b[i-3]==2?0:1))==0?2:1;}
}
void getless() {for (int i = 1; i <= n; i++) {if (a[i] == 1) {if (b[i - 1] == 1) {b[i] = b[i + 1] = 2;}if (b[i] == 1) {b[i - 1] = b[i + 1] = 2;}if (b[i + 1] == 1) {b[i - 1] = b[i] = 2;}if (b[i - 1] == b[i] && b[i] == 2) {b[i + 1] = 1;}if (b[i - 1] == b[i + 1] && b[i - 1] == 2) {b[i] = 1;}if (b[i] == b[i + 1] && b[i] == 2) {b[i - 1] = 1;}}else if (a[i] == 2) {if (b[i - 1] == 2) {b[i] = b[i + 1] = 1;}if (b[i] == 2) {b[i - 1] = b[i + 1] = 1;}if (b[i + 1] == 2) {b[i - 1] = b[i] = 1;}if (b[i - 1] == b[i] && b[i] == 1) {b[i + 1] = 2;}if (b[i - 1] == b[i + 1] && b[i - 1] == 1) {b[i] = 2;}if (b[i] == b[i + 1] && b[i] == 1) {b[i - 1] = 2;}}}
}
int main() {int t;cin >> t;while (t--) {memset(a, 0, sizeof a);memset(b, 0, sizeof b);cin >> n;for (int i = 1; i <= n; i++) {scanf("%d", &a[i]);}b[0] = b[n + 1] = 2;for (int i = 1; i <= n; i++) {if (a[i] == 3)b[i - 1] = b[i] = b[i + 1] = 1;}for (int i = 1; i <= n; i++) {if (a[i] == 0)b[i - 1] = b[i] = b[i + 1] = 2;}getsure();reverse(a + 1, a + n+1);reverse(b + 1, b + n+1);getsure();reverse(a + 1, a + n+1);reverse(b + 1, b + n+1);getless();reverse(a + 1, a + n+1);reverse(b + 1, b + n+1);getless();reverse(a + 1, a + n+1);reverse(b + 1, b + n+1);int cnt1 = 0;for(int i=1;i<=n;i++)if (b[i] == 1) {cnt1++;}printf("%d", cnt1);for (int i = 1; i <= n; i++)if (b[i] == 1)printf(" %d", i);printf("\n");int cnt2 = 0;for (int i = 1; i <= n; i++)if (b[i] == 2)cnt2++;printf("%d", cnt2);for (int i = 1; i <= n; i++) {if (b[i] == 2)printf(" %d", i);}printf("\n");}return 0;
}

#include <cstdio>
#include <memory>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <vector>
#include <cassert>
#include <string>
#include <ctime>
#include <map>
#include <queue>
#include <algorithm>
#include <iostream>
#include <cassert>
#include <stack>
#include <set>
using namespace std;
#define REP(i,n) for(int i=0;i<n;i++)
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define req(i,a,b) for(int i=a;i>=b;i--)
#define rp(i,a) for(int i=head[a];i+1;i=edge[i].next)
#define cl(a,b) memset(a,b,sizeof a);
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define mod 1000000007
const int inf = ~0u >> 2;
const ll INF = (1LL << 62) - 1;
double eps = 1e-9;
const int N = 2e2 + 5;
const int M = 221;int ans = 0, cnt = 0;
int n, m;
char str[M];
int dx[] = {1,1,1,-1,-1,-1,0,0};
int dy[] = {0,1,-1,0,1,-1,1,-1};
int a[N][N],b[N][N];
void setval(int i, int j, int val);void getinit() {for(int i=1;i<=n;i++)for (int j = 1; j <= m; j++) {if (a[i][j] == 0) {for (int k = 0; k < 8; k++) {int ni = i + dx[k];int nj = j + dy[k];if (a[ni][nj] == -1)setval(ni, nj, 2);}}}
}
void setk(int i, int j) {if (i <= 0 || j <= 0 || i > n || j > m)return;int k = a[i][j];if (a[i][j] != -1) {int asum = 0;for (int k = 0; k < 8; k++) {int ni = i + dx[k];int nj = j + dy[k];if (a[ni][nj] == -1)asum += 1;}if (asum == k) {for (int k = 0; k < 8; k++) {int ni = i + dx[k];int nj = j + dy[k];setval(ni, nj, 1);}}}
}
bool isok(int i, int j) {if (i <= 0 || j <= 0 || i > n || j > m)return false;return true;
}
void setval(int i, int j,int value) {if (i <= 0 || j <= 0 || i > n || j > m)return;if (a[i][j]==-1) {if (b[i][j] == 0) {b[i][j] = value;for (int k = 0; k < 8; k++) {int ni = i + dx[k];int nj = j + dy[k];setk(ni, nj);}}}
}struct Node {int x, y, d;int operator <(const Node& rhs)const {return d > rhs.d;}
};
priority_queue<Node> q;
int getsum(int i, int j,int c) {if (i <= 0 || j <= 0 || i > n || j > m) {//printf("-1!!\n");return -1;}int sum = 0;for (int k = 0; k < 8; k++) {int ni = i + dx[k];int nj = j + dy[k];if (b[ni][nj] == c&&a[ni][nj]==-1) {sum++;}}return sum;
}
bool isdealed(int i, int j) {if (i <= 0 || j <= 0 || i > n || j > m) {//printf("-2!!\n");return -1;}if (a[i][j] == -1)return true;if (a[i][j] == 0)return true;if (getsum(i, j, 0) == 0)return true;return false;
}
set<pair<int, int>> getpairs(int i, int j) {if (i <= 0 || j <= 0 || i > n || j > m) {//printf("-3!!\n");return set<pair<int, int>>{};}set<pair<int, int>> pairs;for (int k = 0; k < 8; k++) {int ni = i + dx[k];int nj = j + dy[k];if (a[ni][nj]==-1)pairs.insert(make_pair(ni, nj));}return pairs;
}
bool iscontain(set<pair<int, int>> pairs, set<pair<int, int>> xpairs) {if (pairs.size() <= xpairs.size())return false;bool exist = true;for (auto var : xpairs){if (pairs.count(var)==0) {exist = false;}}return exist;
}
void dealcontain(set<pair<int, int>> pairs, set <pair<int, int>> xpairs) {for (auto var : pairs){if (xpairs.count(var) == 0)setval(var.first, var.second, 1);}
}
void getcontain() {int qcnt = 0;while (!q.empty())q.pop();for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {if (a[i][j] != -1&&!isdealed(i,j)) {q.push(Node{ i,j,getsum(i,j,0) });qcnt++;}}}int outtime = q.size();int curtime = 0;while (!q.empty()) {Node x = q.top(); q.pop();int sum = getsum(x.x, x.y, 0);set<pair<int, int>> xpairs = getpairs(x.x, x.y);vector<Node> surx;for (int i = x.x - 2; i <= x.x + 2; i++) {for (int j = x.y - 2; j <= x.y + 2; j++) {if (!isok(i, j)||i==x.x&&j==x.y)continue;if (a[i][j] != -1) {set<pair<int, int>> pairs = getpairs(i, j);if (iscontain(xpairs, pairs) && a[x.x][x.y] == a[i][j] + (xpairs.size() - pairs.size())) {dealcontain(xpairs, pairs);}}}}if (!isdealed(x.x,x.y)){if (getsum(x.x, x.y, 0) == sum) {q.push(Node{ x.x,x.y,qcnt++ });}else{q.push(Node{ x.x,x.y,getsum(x.x,x.y,0) });}curtime++;}else{outtime = q.size();curtime = 0;}if (curtime == outtime+1) {break;}}}
int main() {int t;cin >> t;while (t--) {memset(a, 0, sizeof a);memset(b, 0, sizeof b);cin >> n >> m;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {scanf("%d", &a[i][j]);}}getinit();for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)setk(i, j);getcontain();int cnt1 = 0;for(int i=1;i<=n;i++)for (int j = 1; j <= m; j++) {if (b[i][j] == 1&&a[i][j]==-1) {cnt1++;}}int cnt2 = 0;for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++) {if (b[i][j] == 2&&a[i][j]==-1)cnt2++;}printf("%d %d", cnt1,cnt2);printf("\n");}return 0;
}

#include <cstdio>
#include <memory>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <vector>
#include <cassert>
#include <string>
#include <ctime>
#include <map>
#include <queue>
#include <algorithm>
#include <iostream>
#include <cassert>
#include <stack>
#include <set>
using namespace std;
#define REP(i,n) for(int i=0;i<n;i++)
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define req(i,a,b) for(int i=a;i>=b;i--)
#define rp(i,a) for(int i=head[a];i+1;i=edge[i].next)
#define cl(a,b) memset(a,b,sizeof a);
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define mod 1000000007
const int inf = ~0u >> 2;
const ll INF = (1LL << 62) - 1;
double eps = 1e-9;
const int N = 2e2 + 5;
const int M = 221;int ans = 0, cnt = 0;
int n, m;
char str[M];
int dx[] = {1,1,1,-1,-1,-1,0,0};
int dy[] = {0,1,-1,0,1,-1,1,-1};
int a[N][N],b[N][N];
void setval(int i, int j, int val);void getinit() {for(int i=1;i<=n;i++)for (int j = 1; j <= m; j++) {if (a[i][j] == 0) {for (int k = 0; k < 8; k++) {int ni = i + dx[k];int nj = j + dy[k];//if (a[ni][nj] == -1)setval(ni, nj, 2);}}if (a[i][j] == 8) {for (int k = 0; k < 8; k++) {int ni = i + dx[k];int nj = j + dy[k];setval(ni, nj, 1);}}}
}
void setk(int i, int j) {if (i <= 0 || j <= 0 || i > n || j > m)return;int k = a[i][j];if (a[i][j] != -1) {int asum = 0;int bsum0 = 0;int bsum1 = 0;for (int k = 0; k < 8; k++) {int ni = i + dx[k];int nj = j + dy[k];if (a[ni][nj] == -1)asum += 1;if (b[ni][nj] == 1)bsum1 += 1;if (b[ni][nj] == 0)bsum0 += 1;}if (bsum1 == k) {for (int k = 0; k < 8; k++) {int ni = i + dx[k];int nj = j + dy[k];if (b[ni][nj] == 0)setval(ni, nj, 2);}}if (bsum1+bsum0==k) {for (int k = 0; k < 8; k++) {int ni = i + dx[k];int nj = j + dy[k];if (b[ni][nj] == 0)setval(ni, nj, 1);}}}
}
bool isok(int i, int j) {if (i <= 0 || j <= 0 || i > n || j > m)return false;return true;
}
void setval(int i, int j,int value) {if (i < 0 || j <= 0 || i > n || j > m)return;//if (a[i][j]==-1) {if (b[i][j] == 0) {b[i][j] = value;for (int k = 0; k < 8; k++) {int ni = i + dx[k];int nj = j + dy[k];setk(ni, nj);}}//}
}struct Node {int x, y, d;int operator <(const Node& rhs)const {return d > rhs.d;}
};
priority_queue<Node> q;
int getsum(int i, int j,int c) {if (i <= 0 || j <= 0 || i > n || j > m) {//printf("-1!!\n");return -1;}int sum = 0;for (int k = 0; k < 8; k++) {int ni = i + dx[k];int nj = j + dy[k];if (b[ni][nj] == c/*&&a[ni][nj]==-1*/) {sum++;}}return sum;
}
bool isdealed(int i, int j) {if (i <= 0 || j <= 0 || i > n || j > m) {//printf("-2!!\n");return -1;}if (a[i][j] == -1)return true;if (a[i][j] == 0)return true;if (getsum(i, j, 0) == 0)return true;return false;
}
set<pair<int, int>> getpairs(int i, int j) {if (i <= 0 || j <= 0 || i > n || j > m) {//printf("-3!!\n");return set<pair<int, int>>{};}set<pair<int, int>> pairs;for (int k = 0; k < 8; k++) {int ni = i + dx[k];int nj = j + dy[k];//if (a[ni][nj]==-1)if(b[ni][nj]==0)pairs.insert(make_pair(ni, nj));}return pairs;
}
bool iscontain(set<pair<int, int>> pairs, set<pair<int, int>> xpairs) {if (pairs.size() <= xpairs.size())return false;bool exist = true;for (auto var : xpairs){if (pairs.count(var)==0) {exist = false;}}return exist;
}
void dealcontain(set<pair<int, int>> pairs, set <pair<int, int>> xpairs) {for (auto var : pairs){if (xpairs.count(var) == 0)setval(var.first, var.second, 1);}
}
void getcontain() {int qcnt = 0;while (!q.empty())q.pop();for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {if (a[i][j] != -1&&!isdealed(i,j)) {q.push(Node{ i,j,getsum(i,j,0) });qcnt++;}}}int outtime = q.size();int curtime = 0;while (!q.empty()) {Node x = q.top(); q.pop();int sum = getsum(x.x, x.y, 0);set<pair<int, int>> xpairs = getpairs(x.x, x.y);vector<Node> surx;for (int i = x.x - 2; i <= x.x + 2; i++) {for (int j = x.y - 2; j <= x.y + 2; j++) {if (!isok(i, j)||i==x.x&&j==x.y)continue;if (a[i][j] != -1) {set<pair<int, int>> pairs = getpairs(i, j);if (iscontain(xpairs, pairs) && a[x.x][x.y]-getsum(x.x,x.y,1) == a[i][j]-getsum(i,j,1) + (xpairs.size() - pairs.size())) {dealcontain(xpairs, pairs);}}}}if (!isdealed(x.x,x.y)){if (getsum(x.x, x.y, 0) == sum) {q.push(Node{ x.x,x.y,qcnt++ });}else{q.push(Node{ x.x,x.y,getsum(x.x,x.y,0) });}curtime++;}else{outtime = q.size();curtime = 0;}if (curtime == outtime+1) {break;}}}
int main() {int t;cin >> t;while (t--) {memset(a, -1, sizeof a);memset(b, 0, sizeof b);cin >> n >> m;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {scanf("%d", &a[i][j]);if (a[i][j] != -1)//b[i][j] = 2;setval(i, j, 2);}}for (int i = 0; i <= n + 1; i++) {//setval(i, 0, 2);//setval(i, m + 1, 2);b[i][0] = b[i][m + 1] = 2;}for (int i = 0; i <= m + 1; i++) {//setval(0, i, 2);//setval(n + 1, i, 2);b[0][i] = b[n + 1][i] = 2;}getinit();for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)setk(i, j);getcontain();int cnt1 = 0;for(int i=1;i<=n;i++)for (int j = 1; j <= m; j++) {if (b[i][j] == 1&&a[i][j]==-1) {cnt1++;}}int cnt2 = 0;for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++) {if (b[i][j] == 2&&a[i][j]==-1)cnt2++;}printf("%d %d", cnt1,cnt2);printf("\n");}return 0;
}

转载于:https://www.cnblogs.com/HaibaraAi/p/6272219.html

Hihocoder 小Hi小Ho扫雷作死一二三相关推荐

  1. hihoCoder 1114 小Hi小Ho的惊天大作战:扫雷·一 最详细的解题报告

    题目来源:小Hi小Ho的惊天大作战:扫雷·一 解题思路:因为只要确定了第一个是否有地雷就可以推算出后面是否有地雷(要么为0,要么为1,如果不是这两个值就说明这个方案行不通),如果两种可能中有一种成功, ...

  2. 摸鱼小游戏其二:扫雷

    目录 正文前的碎碎念 前言 正文 主函数 game() 各个模块的具体实现 InitBoard()初始化棋盘 DisplayBoard() 打印棋盘 FindMine() 扫雷函数 SetMine() ...

  3. Unity3D小功能 小技巧 小教程 小原理(持续更新...)

    Unity3D小功能 小技巧 小教程 小原理(持续更新...) 1.Unity的.NET版本是2.0 按道理来说,C#能用的功能Unity也能用,但是Unity的.NET却不是最新版 要是用一些别的D ...

  4. Python的一些小技巧小知识

    Chapter 12. HOW-TO 本章内容记录Python的一些小技巧小知识.来源是网上摘录或自己学习所得. 如何判断操作系统类型 import sys print sys.platform pr ...

  5. 前端兼容性问题:快速去掉mac safari浏览器input右边的小图标/小按钮

    去掉mac safari浏览器input右边的小图标/小按钮 input:focus::-webkit-contacts-auto-fill-button{opacity: 0; } 复制代码 去掉S ...

  6. 大三软件工程小项目-小技术集合总结

    大三软件工程小项目-小技术集 此篇文章是给出了此小项目用到的技术的总结: 方便自己有忘记的知识点后方便查阅. 也方便有需要的博友看. 下面是各个计算的链接 大家点击了进能进去 大三软件工程小项目-小技 ...

  7. 添加组件_苹果ios14怎么添加删除小组件 小组件叠放添加设置教程

    苹果ios14怎么添加删除小组件 小组件叠放添加设置教程 iOS14最吸引人的功能莫过于小组件,可以根据需求添加自己想要的功能,简单易用,系统功能得到改善和提升,让iOS使用更加便捷. iOS14小组 ...

  8. 恭喜小S小姐姐落户买房

    年初听说小s小姐姐正在办理人才引进落户,以为凭上海的办事效率,可能需要很久很久呢?结果三月份就公示了,然后四月份彻底落户,小姐姐也办理了身份证的更新换代操作. 恭喜恭喜,挨踢人士不容易啊,转户成功就意 ...

  9. 微信测试睡眠的软件,微信小睡眠小程序使用方法

    小睡眠APP是一款手机上的睡眠质量辅助软件,在小睡眠APP中用户可以掌握自己的睡眠质量哦,其中小睡眠APP在睡眠方面还是很到位的哦,今天小编就整理了小睡眠APP相关的使用教程,有需求的小伙伴不要错过了 ...

最新文章

  1. Drupal 网站漏洞修复以及网站安全防护加固方法
  2. Mybatis执行过程源码分析
  3. 1022: [SHOI2008]小约翰的游戏John【Nim博弈,新生必做的水题】
  4. hive中实现行转列_Hive之行转列lateral view用法
  5. Oracle存储过程异常
  6. 信息管理系统项目前端界面设计
  7. Eclipse快捷键 10个最有用的快捷键
  8. android 拍照添加背景颜色,怎么改变证件照的底色
  9. C语言拍皮球双重循环,山东理工大学ACM平台题答案关于C语言 1184 C语言实验——拍皮球...
  10. 【C++】优先级队列priority_queue模拟实现仿函数
  11. 最简单的 iPad 屏幕适配方案
  12. 【实践】关于智能蛇的三次尝试
  13. 【​观察】中国云计算产业的下半场 京东云正在下一盘怎样的大棋?
  14. 微信第三方服务平台java授权获取token(一)
  15. ASR 混合高斯模型GMM的理解
  16. Java 计算时间差之年龄问题
  17. 微信小程序可自定义单片机温湿度阈值(基于esp32c3+onenet+微信小程序)
  18. AE 多进程渲染-命令行-aerender-多cmd窗口实现
  19. 原理图以及vhdl设计一位全加器
  20. 【单片机毕业设计】【mcuclub-110】蓝牙空气质量检测(CO) | 环境检测 | 气体检测 | 室内有害气体检测 | 一氧化碳检测

热门文章

  1. SpringBoot项目redis的消息队列
  2. redis 保存 array list 区别_Redis科普篇
  3. idea从gitlab拉项目到本地_Git入门-基础命令,用github免费服务器域名部署小项目...
  4. pycharm快速添加函数及参数注释_后端开发使用pycharm的技巧
  5. javascript 克隆/clone:Object.assign
  6. 【SpringBoot Testing】测试类/测试用例格式
  7. 【Centos 8】【Centos 7】【Docker】 添加 DockerHub 的镜像地址
  8. apply和call
  9. mysql5.7 忘记root密码后,如何找回密码?
  10. python翻页_python实现电子书翻页小程序