题意:

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的更多相关文章

  1. 2020杭电多校 10C / HDU 6879 - Mine Sweeper (构造)

    HDU 6879 - Mine Sweeper 题意 定义<扫雷>游戏的地图中每个空白格子的值为其周围八个格子内地雷的数量(即游戏内临近地雷数量的提示) 则一张地图的值\(S\)为所有空白 ...

  2. 【2020杭电多校】Distinct Sub-palindromes 找规律

    题目链接:Distinct Sub-palindromes 题意: 给你一个长度n,你需要找出来一些串,这些串由A...Z和a...z构成.我们设长度为n的所有串中所包含回文子串最少的数量为ans.问 ...

  3. 【2020杭电多校】 Lead of Wisdom、The Oculus

    题目链接:Lead of Wisdom 题意:有n个物品,这些物品有k种类型.每种物品有对应的类型ti,其他值ai,bi,ci,di 你可以选择一些物品,但是这些物品要保证它们任意两者之间类型不能相同 ...

  4. 【2020杭电多校】Total Eclipse 并查集+思维

    题目链接:Total Eclipse 题意: t组输入,给你一个由n个点,m条边构成的图,每一个点的权值是ai.你每一次可以选择一批联通的点,然后让他们的权值都减去1.问最后把所有点的权值都变成0需要 ...

  5. 可持久化线段树的学习(区间第k大和查询历史版本的数据)(杭电多校赛第二场1011)

    以前我们学习了线段树可以知道,线段树的每一个节点都储存的是一段区间,所以线段树可以做简单的区间查询,更改等简单的操作. 而后面再做有些题目,就可能会碰到一种回退的操作.这里的回退是指回到未做各种操作之 ...

  6. 2018 Multi-University Training Contest 1 杭电多校第一场

    抱着可能杭电的多校1比牛客的多校1更恐怖的想法 看到三道签到题 幸福的都快哭出来了好吗 1001  Maximum Multiple(hdoj 6298) 链接:http://acm.hdu.edu. ...

  7. HDU 4941 Magical Forest(map映射+二分查找)杭电多校训练赛第七场1007

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4941 解题报告:给你一个n*m的矩阵,矩阵的一些方格中有水果,每个水果有一个能量值,现在有三种操作,第 ...

  8. HDU 4902 Nice boat 2014杭电多校训练赛第四场F题(线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 解题报告:输入一个序列,然后有q次操作,操作有两种,第一种是把区间 (l,r) 变成x,第二种是 ...

  9. HDU 5821 Ball (贪心排序) -2016杭电多校联合第8场

    题目:传送门. 题意:T组数据,每组给定一个n一个m,在给定两个长度为n的数组a和b,再给定m次操作,每次给定l和r,每次可以把[l,r]的数进行任意调换位置,问能否在转换后使得a数组变成b数组. 题 ...

随机推荐

  1. Docker 镜像基础(三)

    基于Dockerfile制作yum版本nginx镜像 [root@node-2 ~]# mkdir /opt/nginx [root@node-2 ~]# cd /opt/nginx/ ## 创建Do ...

  2. python中re模块的使用(正则表达式)

    一.什么是正则表达式? 正则表达式,又称规则表达式,通常被用来检索.替换那些符合某个模式(规则)的文本. 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合, ...

  3. 十八:SQL注入之堆叠及绕WAF

    堆叠查询注入 (双查询注入) stacked injections(堆叠注入)从名词的含义就可以看到是一堆的SQL语句一起执行,而在真实的运用中也是这样的,我们知道在mysql中,主要是命令行中,每一 ...

  4. 爬虫系列 | 6、详解爬虫中BeautifulSoup4的用法

    bs4,全称BeautifulSoup 4 , 它是Python独有的一种解析方式.也就是说只有Python语言才可以通过这种方式去解析数据. BeautifulSoup 3 只支持Python2,所 ...

  5. LeetCode530. 二叉搜索树的最小绝对差

    题目 又是常见的BST,要利用BST的性质,即中序遍历是有序递增序列. 法一.中序遍历 1 class Solution { 2 public: 3 vector<int>res; 4 v ...

  6. 面向对象的延伸与Java内部定义类的应用

    识别类 传统的过程化程序设计,必须从顶部的main函数开始编写程序,在面向对象程序设计时没有所谓的"顶部".首先从设计类开始,然后再往每个类中添加方法. 识别类的规则是在分析问题的 ...

  7. 【工具篇】Mysql的安装和使用

    [导读]Mysql是数据分析师入门级的技能之一,对于很多小白同学来说,可能还没有机会接触SQL知识.那么我们如何熟悉和练习SQL呢,今天教大家安装两个软件:MySQL和Navicat.后续我们会推出S ...

  8. 前端PDF文件转图片方法

    第一步:先下载pdfjs,网址:PDF下载地址,再引入到项目中,我是标签直接引用的 <script src="pdfjs/build/pdf.js"></scri ...

  9. linux通过ntpd同步服务器时间,

    ntpd得rpm包下载地址:https://pkgs.org/download/ntp 比如我得服务器版本是centos7 x86的,那选择我点击的这一个: 下拉到最下面就有安装包下载了,我选择的是二 ...

  10. yoctoproject 地址

    第一次接触到yoctop. 在这里分享yoctoproject地址 https://www.yoctoproject.org/docs/2.3.3/ref-manual/ref-manual.html ...