1 条题解
-
0
Problem: 扫雷!
时间限制:1s
空间限制:256MB
Description
鉴于原力清理大师被 种扫雷变体折磨的遍体鳞伤,于是原力清理大师秉承着“打不过就加入”的原则,立志也要做“埋雷人”。但是谁让原力清理大师自己笨呢,他不知道怎么设计比较好,于是又双叒叕向你寻求帮助。现在,原力清理大师的要求如下:
①原力清理大师会给出一个正整数 ,表示所要设计的雷区边长(为 的正方形)。
②雷区中每一格内可包含的元素共有三种:数字(1),问号(2),雷(3)。
③你需要给出雷的数量 ;然后给出初始翻开的格子数量 (至多为 ),并给出初始翻开的格子的坐标(4) ;最后,你需要给出一个 的矩阵,表示你所设计的雷区图,三类元素对应符号见上述定义。
④你需要保证每行的雷数量、每列的雷数量都两两相等。
⑤你还需要保证雷区连通(5),非雷区连通。
原力清理大师是个贪心的人,他不满足于简简单单出一张图,所以,请你简简单单的出 张满足要求的图,而且是雷的数量不一样的 张图。
注意:无论如何,第一要义是要保证你的图对于扫雷人来说可解!
数字:设该格子的坐标为 ,对于任意格子 ,若两格子之间满足 ,则称格子 在格子 的周边。每个格子的数字代表其周边格子内雷的数量的总和对 取模的结果。在图中用 到 及其之间的整数表示。
问号:该格子本质上依然为数字而非雷,但是扫雷者并不能从此得到该格子周边的雷的信息。在图中用 表示。
雷:雷,在图中用 表示。
定义:定义图中从上往下依次为第 行,从左往右依次为 列,则第 行第 列的格子坐标为 。
对于任意两个格子 ,若两个格子的曼哈顿距离 ,则称这两个格子连通。
Answer
好多条件,完蛋了(?)
并非完蛋。
谁说扫雷就一定要往里面放雷了?题目没规定,那我不放雷不就是了(手动狗头)。所以,有很多种解法,就是在里面放一大堆 ,或者放点问号进去,或者都写问号。
但是,两张图要求雷的数量不一样,那第二张怎么办?
其实也很简单,你把雷放满不就是了(二连狗头)。
至于是否有其他雷的数量的合法解?那必然是没有的。
假设每行有雷数量 个,显然每列的雷数量也为 ,总雷数量 。由于每行都有雷,而且雷都互相连通,在已知必然有雷的情况下,雷区会将图中的非雷区分为上下(或者左右)两个部分。由于非雷区也需要互相连通,所以至少被分割的两部分中至少有一部分非雷数量为 ,可以发现,至少有一行或者有一列,满雷。因此,每行有 个雷,则图中满雷,因此没有其他合法解。
至于数量模 这个条件其实影响不大,有没有都不影响解的唯一性。至于是否要翻开格子,其实也无所谓,扫雷者一看到雷的数量就明白了。
Code
#include<bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); int n;cin>>n; cout<<0<<" "<<0<<endl; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) cout<<0; cout<<endl; } cout<<n*n<<" "<<0<<endl; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) cout<<"*"; cout<<endl; } return 0; }
- 1
信息
- ID
- 373
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 32
- 已通过
- 7
- 上传者