2020杭电多校 C / HDU 6879 - Mine Sweeper
题意:
t组输入,每组输入一个s
你需要输出一个r行c列的阵列,这个阵列中‘X’代表炸弹,‘.’表示没有炸弹
对于‘.’这些位置都会有一个数值,这个值取决于这个位置附近8个位置,这8个位置一共有几个炸弹,那么这个数值就是多少
你输出的r行c列阵列要满足将所有‘.’位置的数值加起来之和要等于s
题解:
网上有一种随机数生成这个阵列的方式


1 #include <bits/stdc++.h>
2 using namespace std;
3 #define between(x, a, b) (a<=x && x<=b)
4 const int dir[8][2] = {1, 0, 0, 1, -1, 0, 0, -1, -1, -1, -1, 1, 1, -1, 1, 1};
5 int n;
6
7 map<int, vector<vector<char>>> mp;
8
9 int solve(vector<vector<char>> a) {
10 int r = a.size();
11 int c = a[0].size();
12 int res = 0;
13 for (int i = 0; i < r; i++) {
14 for (int j = 0; j < c; j++) {
15 if (a[i][j] == '.') {
16 int cnt = 0;
17 for (int l = 0; l < 8; l++) {
18 int dx = i + dir[l][0];
19 int dy = j + dir[l][1];
20 if (between(dx, 0, r - 1) && between(dy, 0, c - 1) && a[dx][dy] == 'X') {
21 cnt++;
22 }
23 }
24 res += cnt;
25 }
26 }
27 }
28 return res;
29 }
30
31 void init() {
32 srand((int) time(0));
33 for (int k = 1; k <= 50000; k++) {
34 int r = (rand() % 25) + 1;
35 int c = (rand() % 25) + 1;
36 vector<vector<char>> a(r, vector<char>(c));
37 for (int i = 0; i < r; i++) {
38 for (int j = 0; j < c; j++) {
39 a[i][j] = (rand() % 2) ? 'X' : '.';
40 }
41 }
42 int sum = solve(a);
43 mp[sum] = a;
44 }
45 }
46
47 int main() {
48 ios::sync_with_stdio(false);
49 cin.tie(0), cout.tie(0);
50
51 init();
52 int T;
53 cin >> T;
54 for (int cs = 1; cs <= T; cs++) {
55 cin >> n;
56 vector<vector<char>> a = mp[n];
57
58 int r = a.size();
59 int c = a[0].size();
60 cout << r << " " << c << endl;
61 for (int i = 0; i < r; i++) {
62 for (int j = 0; j < c; j++) {
63 cout << a[i][j] << (j == c - 1 ? "\n" : "");
64 }
65 }
66 }
67 return 0;
68 }
另一种方式如下(参考:https://www.cnblogs.com/stelayuri/p/13538892.html):
如下所示一个地雷的贡献就是8
那么如果s是8的倍数,那就for循环构造多个这样的造型就可以
然后你找出来s=1、2、3、4、5、6、7的时候地雷怎么放置,特判一下s<8的情况
然后再找一下s=8k+m(1<=m<=7)
这种类型的构造一下
代码:


1 #include<bits/stdc++.h>
2 using namespace std;
3
4 int mp[1010][28][28];
5 int maxCol[1010];
6
7 void init()
8 {
9 for(int i=8;i<=1000;i++)
10 {
11 int les=i/8,j,k;
12 for(j=2;j<=24;j+=2)
13 {
14 for(k=2;k<=24;k+=2)
15 {
16 mp[i][j][k]=1;
17 if(--les==0)
18 break;
19 }
20 if(les==0)
21 break;
22 }
23 switch(i%8)
24 {
25 case 0:
26 maxCol[i]=j+1;
27 break;
28 case 1:
29 mp[i][1][1]=1;
30 maxCol[i]=j+1;
31 break;
32 case 2:
33 mp[i][1][1]=mp[i][1][2]=1;
34 maxCol[i]=j+1;
35 break;
36 case 3:
37 mp[i][1][2]=1;
38 maxCol[i]=j+1;
39 break;
40 case 4:
41 mp[i][1][2]=mp[i][2][1]=1;
42 maxCol[i]=j+1;
43 break;
44 case 5:
45 mp[i][j+2][2]=1;
46 maxCol[i]=j+2;
47 break;
48 case 6:
49 mp[i][j+2][1]=mp[i][j+2][2]=1;
50 maxCol[i]=j+2;
51 break;
52 case 7:
53 mp[i][j+3][1]=mp[i][j+3][2]=mp[i][j+2][1]=1;
54 maxCol[i]=j+3;
55 break;
56 }
57 }
58 }
59
60 int main()
61 {
62 init();
63 int T,S;
64 scanf("%d",&T);
65 while(T--)
66 {
67 scanf("%d",&S);
68 if(S>=8)
69 {
70 printf("%d 25\n",maxCol[S]);
71 for(int i=1;i<=maxCol[S];i++)
72 {
73 for(int j=1;j<=25;j++)
74 {
75 if(mp[S][i][j])
76 putchar('X');
77 else
78 putchar('.');
79 }
80 putchar('\n');
81 }
82 }
83 else if(S==0)
84 {
85 puts("1 1");
86 puts(".");
87 }
88 else if(S==1)
89 {
90 puts("1 2");
91 puts("X.");
92 }
93 else if(S==2)
94 {
95 puts("1 3");
96 puts("X.X");
97 }
98 else if(S==3)
99 {
100 puts("2 2");
101 puts("X.");
102 puts("..");
103 }
104 else if(S==4)
105 {
106 puts("2 2");
107 puts("X.");
108 puts("X.");
109 }
110 else if(S==5)
111 {
112 puts("2 3");
113 puts(".X.");
114 puts("...");
115 }
116 else if(S==6)
117 {
118 puts("2 3");
119 puts("XX.");
120 puts("...");
121 }
122 else if(S==7)
123 {
124 puts("3 3");
125 puts("XX.");
126 puts("X..");
127 puts("...");
128 }
129 }
130 return 0;
131 }
2020杭电多校 C / HDU 6879 - Mine Sweeper的更多相关文章
- 2020杭电多校 10C / HDU 6879 - Mine Sweeper (构造)
HDU 6879 - Mine Sweeper 题意 定义<扫雷>游戏的地图中每个空白格子的值为其周围八个格子内地雷的数量(即游戏内临近地雷数量的提示) 则一张地图的值\(S\)为所有空白 ...
- 【2020杭电多校】Distinct Sub-palindromes 找规律
题目链接:Distinct Sub-palindromes 题意: 给你一个长度n,你需要找出来一些串,这些串由A...Z和a...z构成.我们设长度为n的所有串中所包含回文子串最少的数量为ans.问 ...
- 【2020杭电多校】 Lead of Wisdom、The Oculus
题目链接:Lead of Wisdom 题意:有n个物品,这些物品有k种类型.每种物品有对应的类型ti,其他值ai,bi,ci,di 你可以选择一些物品,但是这些物品要保证它们任意两者之间类型不能相同 ...
- 【2020杭电多校】Total Eclipse 并查集+思维
题目链接:Total Eclipse 题意: t组输入,给你一个由n个点,m条边构成的图,每一个点的权值是ai.你每一次可以选择一批联通的点,然后让他们的权值都减去1.问最后把所有点的权值都变成0需要 ...
- 可持久化线段树的学习(区间第k大和查询历史版本的数据)(杭电多校赛第二场1011)
以前我们学习了线段树可以知道,线段树的每一个节点都储存的是一段区间,所以线段树可以做简单的区间查询,更改等简单的操作. 而后面再做有些题目,就可能会碰到一种回退的操作.这里的回退是指回到未做各种操作之 ...
- 2018 Multi-University Training Contest 1 杭电多校第一场
抱着可能杭电的多校1比牛客的多校1更恐怖的想法 看到三道签到题 幸福的都快哭出来了好吗 1001 Maximum Multiple(hdoj 6298) 链接:http://acm.hdu.edu. ...
- HDU 4941 Magical Forest(map映射+二分查找)杭电多校训练赛第七场1007
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4941 解题报告:给你一个n*m的矩阵,矩阵的一些方格中有水果,每个水果有一个能量值,现在有三种操作,第 ...
- HDU 4902 Nice boat 2014杭电多校训练赛第四场F题(线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 解题报告:输入一个序列,然后有q次操作,操作有两种,第一种是把区间 (l,r) 变成x,第二种是 ...
- HDU 5821 Ball (贪心排序) -2016杭电多校联合第8场
题目:传送门. 题意:T组数据,每组给定一个n一个m,在给定两个长度为n的数组a和b,再给定m次操作,每次给定l和r,每次可以把[l,r]的数进行任意调换位置,问能否在转换后使得a数组变成b数组. 题 ...
随机推荐
- LeetCode278 第一个错误的版本
你是产品经理,目前正在带领一个团队开发新的产品.不幸的是,你的产品的最新版本没有通过质量检测.由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的. 假设你有 n 个版本 [1, ...
- MySQL的CURD 增删改查
添加 insert 语法: 单条:insert into 表名('字段1', '字段2', ...) values('值1', '值2', ...) 多条:insert into 表名('字段1', ...
- kubernets之secret资源
一 对于一些保密度比较高的文件,k8s又是如何存储的呢? 针对那些保密度比较高的配置文件,例如证书以及一些认证配置不能直接存储在configmap中,而是需要存储在另外一种资源中,需要对存储在里面的 ...
- React 入门-redux 和 react-redux
React 将页面元素拆分成组件,通过组装展示数据.组件又有无状态和有状态之分,所谓状态,可以简单的认为是组件要展示的数据.React 有个特性或者说是限制单向数据流,组件的状态数据只能在组件内部修改 ...
- 使用Azure Runbook 发送消息到Azure Storage Queue
客户需要定时发送信息到Azure Storage Queue,所以尝试使用Azure Runbook实现这个需求. 首先新增一个Azure Automation Account的资源. 因为要使用Az ...
- 1、进程管理常用命令和进程ID
常用命令 1. ps (英文全拼:process status)命令用于显示当前进程的状态,类似于 windows 的任务管理器. 详细介绍参照:https://www.runoob.com/linu ...
- 一文说通Dotnet的委托
简单的概念,也需要经常看看. 一.前言 先简单说说Delegate的由来.最早在C/C++中,有一个概念叫函数指针.其实就是一个内存指针,指向一个函数.调用函数时,只要调用函数指针就可以了,至于函 ...
- CPU飙高,系统性能问题如何排查?
CPU飙高,系统性能问题如何排查? 原创 雍雍 阿里技术 2020-09-29 https://mp.weixin.qq.com/s/fzLcAkYwKhj-9hgoVkTzaw
- assets和static的区别
相同点:assets和static两个都是存放静态资源文件.项目中所需要的资源文件图片,字体图标,样式文件等都可以放在这两个文件下,这是相同点不相同点:assets中存放的静态资源文件在项目打包时,也 ...
- 洛谷P4180
被教练安排讲题 可恶 这道题我是十月初上课时花了一下午做出来的,当时连倍增都不会,过程比较困难,现在看看还可以 本来想口胡一发,后来想了想可能以后要用,还是写成文章吧 Description 求一棵严 ...