HDU 6879 - Mine Sweeper

题意

定义《扫雷》游戏的地图中每个空白格子的值为其周围八个格子内地雷的数量(即游戏内临近地雷数量的提示)

则一张地图的值\(S\)为所有空白格子的值总和

现给定\(S\),要求构造出一张长度与宽度均不超过\(25\)的地图,使其值等于\(S\)

限制

\(1\leq T\leq 1001\)

\(0\leq S\leq 1000\)

思路

这题过的人数应该是最多的,所以肯定是存在比我的想法更优更方便的解的

但是题解写的不是很清楚,所以还是写下了这篇博客(画图好累……)

发现\(T_{max}=|S|\),范围内每个值肯定都会问一遍,考虑预处理所有方案(在线输出好像也没有问题的样子)

首先发现,如果一个地雷周围没有其他地雷,也没有障碍物(表示它不在图的边界上)

那么这个地雷对于答案的贡献就是\(8\)

考虑所有地雷都互不相邻的情况(一个地雷周围一圈不存在其他地雷)

由于图最大尺寸为\(25\times 25\)

地雷分布情况为\((2,2),(2,4),\dots,(2,24),(4,2),(4,4),\dots,(24,24)\)

这样总共能放置\(12\times 12=144\)个对答案贡献为\(8\)的地雷

由于\(144\times 8>1000\),这样的分布绰绰有余

所以得到一个结论:只要\(S\)为\(8\)的倍数,那么它一定有解


首先考虑\(S\lt 8\)的所有情况

当\(S=0\)时,直接输出一个\(1\times 1\)的空图即可

当\(S=1\)时

当\(S=2\)时

当\(S=3\)时

当\(S=4\)时

当\(S=5\)时

当\(S=6\)时

当\(S=7\)时


既然已经能够确定一个数的倍数一定有解了,那我们可以尝试找找看能否依托\(8\)来找出其他情况

也就是把\(S\geq 8\)的所有情况看成以下的形式之一表示

\[\left \{
\begin{aligned}
8&k\\
8&k+1\\
8&k+2\\
8&k+3\\
8&k+4\\
8&k+5\\
8&k+6\\
8&k+7\\
\end{aligned}
\right \}
,\ k\in \Z
\]

对于\(S=8k+1\)的情况:

在\((1,1)\)的位置多放置一个地雷,可以使得原本位于\((2,2)\)的地雷对答案的贡献由\(8\)变成\(9\),且不影响其他地雷的贡献

对于\(S=8k+2\)的情况:

在\((1,1)\)与\((1,2)\)的位置多放置两个地雷,可以使得原本位于\((2,2)\)的地雷对答案的贡献由\(8\)变成\(10\),且不影响其他地雷的贡献

对于\(S=8k+3\)的情况:

在\((1,2)\)的位置多放置一个地雷,可以使得原本位于\((2,2)\)的地雷对答案的贡献由\(8\)变成\(11\),且不影响其他地雷的贡献

对于\(S=8k+4\)的情况:

在\((1,2)\)与\((2,1)\)的位置多放置两个地雷,可以使得原本位于\((2,2)\)的地雷对答案的贡献由\(8\)变成\(12\),且不影响其他地雷的贡献

对于\(S=8k+5\)的情况:

仅先看放置贡献为\(8\)的地雷,假设最后一个放置的地雷位于第\(i\)行

为了不影响它对答案的贡献,那么第\(i+1\)行不能放东西

由上面\(S=5\)的情况可得,我们可以将其上下倒置放在第\(i+2\)行,从而防止其对其他地雷贡献造成影响

(边界限制可行性证明在下面)

对于\(S=8k+6\)的情况:

参考\(S=6\),同样的,为了不产生冲突,只能放置在第\(i+2\)行

对于\(S=8k+7\)的情况:

由于\(S=7\)的情况里地雷需要占两行

所以要将\(S=7\)的情况倒置放在\(S=8k\)的第\(i+2\)行与第\(i+3\)行

(边界限制可行性证明在下面)


直接证明\(S=8k+7\)时需要用到\(i+3\)行的可行性情况吧

由于\(S\)最大为\(1000\),如果全部使用贡献为\(8\)的地雷方案填充地图,最多只需要\(125\)个地雷

每行最多能放置\(12\)个这种方案的地雷,那么最多只需要用到第\(11\)行过

对于原图,由于地雷在行之间也需要空一行,故\(i\)的最大值为\(22\)

\(22+3=25\),恰好满足题目要求,故方案可行


综上,本题所有\(S\)情况均有解,预处理后直接输出即可

注意,\(S=8k\)的情况最后也需要输出\(i+1\)行(最后一行空着,以保证有空格子让地雷做出贡献,即让最后一行的地雷非边界)

示例

如果没大看懂上面的例子,这里放几张截图领会一下大致意思即可















代码

(0ms~31ms/1000ms)

#include<bits/stdc++.h>
using namespace std; int mp[1010][28][28];
int maxCol[1010]; void init()
{
for(int i=8;i<=1000;i++)
{
int les=i/8,j,k;
for(j=2;j<=24;j+=2)
{
for(k=2;k<=24;k+=2)
{
mp[i][j][k]=1;
if(--les==0)
break;
}
if(les==0)
break;
}
switch(i%8)
{
case 0:
maxCol[i]=j+1;
break;
case 1:
mp[i][1][1]=1;
maxCol[i]=j+1;
break;
case 2:
mp[i][1][1]=mp[i][1][2]=1;
maxCol[i]=j+1;
break;
case 3:
mp[i][1][2]=1;
maxCol[i]=j+1;
break;
case 4:
mp[i][1][2]=mp[i][2][1]=1;
maxCol[i]=j+1;
break;
case 5:
mp[i][j+2][2]=1;
maxCol[i]=j+2;
break;
case 6:
mp[i][j+2][1]=mp[i][j+2][2]=1;
maxCol[i]=j+2;
break;
case 7:
mp[i][j+3][1]=mp[i][j+3][2]=mp[i][j+2][1]=1;
maxCol[i]=j+3;
break;
}
}
} int main()
{
init();
int T,S;
scanf("%d",&T);
while(T--)
{
scanf("%d",&S);
if(S>=8)
{
printf("%d 25\n",maxCol[S]);
for(int i=1;i<=maxCol[S];i++)
{
for(int j=1;j<=25;j++)
{
if(mp[S][i][j])
putchar('X');
else
putchar('.');
}
putchar('\n');
}
}
else if(S==0)
{
puts("1 1");
puts(".");
}
else if(S==1)
{
puts("1 2");
puts("X.");
}
else if(S==2)
{
puts("1 3");
puts("X.X");
}
else if(S==3)
{
puts("2 2");
puts("X.");
puts("..");
}
else if(S==4)
{
puts("2 2");
puts("X.");
puts("X.");
}
else if(S==5)
{
puts("2 3");
puts(".X.");
puts("...");
}
else if(S==6)
{
puts("2 3");
puts("XX.");
puts("...");
}
else if(S==7)
{
puts("3 3");
puts("XX.");
puts("X..");
puts("...");
}
}
return 0;
}

2020杭电多校 10C / HDU 6879 - Mine Sweeper (构造)的更多相关文章

  1. 2020杭电多校 C / HDU 6879 - Mine Sweeper

    题意: t组输入,每组输入一个s 你需要输出一个r行c列的阵列,这个阵列中'X'代表炸弹,'.'表示没有炸弹 对于'.'这些位置都会有一个数值,这个值取决于这个位置附近8个位置,这8个位置一共有几个炸 ...

  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. 十二:SQL注入之简要注入

    SQL注入漏洞将是重点漏洞,分为数据库类型,提交方法,数据类型等方式.此类漏洞是WEB漏洞中的核心漏洞,学习如何的利用,挖掘,和修复是重要的. SQL注入的危害 SQL注入的原理 可控变量,带入数据库 ...

  2. Oracle Rac to Rac One Node

    =~=~=~=~=~=~=~=~=~=~=~= PuTTY log 2020.01.14 20:05:12 =~=~=~=~=~=~=~=~=~=~=~= [oracle@rac01 ~]$ srvc ...

  3. pg_rman的安装与使用

    1.下载对应数据库版本及操作系统的pg_rman源码 https://github.com/ossc-db/pg_rman/releases 本例使用的是centos6.9+pg10,因此下载的是pg ...

  4. 一个简单的IM聊天程序Pie IM(以后会更新)

    这个程序用多线程,实现设备之间的聊天,支持win10通知,欢迎下载 依赖的第三方库 win10toast 代码 将以下代码写入任意.py文件 1 print('Welcome to use Pie I ...

  5. 盼望着,盼望着。它终于来了!!!剪辑Windows PC测试版!

    盼望着,盼望着.它终于来了!!!剪辑Windows PC测试版! 喜欢短视频抖音的小伙伴们,是不是都对手机抖音剪映操作不是很满意.期待WINDOWS电脑版剪映的来临.在此之前只有MAC版本,不能满足广 ...

  6. 前端工程构建之谈:gulp3要不要升级到Gulp4

    关于升级还是不升级,这是一个哲学问题. gulp4的语法更加现代,支持ES6的大部分写法,使用exports的方式去暴露任务组合,更加灵活和便捷. gulp4同时也提供了很多强大的API,例如para ...

  7. C# Twain协议调用扫描仪,设置多图像输出模式(Multi image output)

    Twain 随着扫描仪.数码相机和其他图像采集设备的引入,用户热切地发现了将图像整合到他们的文档和其他工作中的价值.然而,支持这种光栅数据的显示和操作成本很高,应用程序开发人员需要创建用户界面并内置设 ...

  8. Profile Guided Optimization Link Time Optimization

    https://github.com/python/cpython Profile Guided Optimization PGO takes advantage of recent versions ...

  9. Sapphire: Copying GC Without Stopping the World

    https://people.cs.umass.edu/~moss/papers/jgrande-2001-sapphire.pdf Many concurrent garbage collectio ...

  10. 小步前进之WebService

    WebService Web Service 什么是Web Service? 为什么使用Web Service XML 什么是XML? 为什么使用XML? SOAP(Simple Object Acc ...