Mine Sweeper
题目大意
扫雷,一个数字代表周围一圈里有多少个雷。
给出一个数N,代表所有数字的和。
让构造一个所有数字和是N的棋盘。
(雷的地方没有数字)
要求大小行、列都小于等于25
题解
艹,没有看数据范围是1000,还在想怎么能装下最多的,最多装多少。。
x代表炸弹.代表没有炸弹
由于 . 太小了,看不见,我们用@代替
n是1的情况:X@
n是2的情况:X@X
n是3的情况:X@X@
一次类推,可以得到n小于等于24的情况。(因为这个只是一行)
在一个九个格子的中间放一个,可以贡献8,
还有在右下角放一个贡献3,
所以可以把25以后的变成8x + 3y的形式。(y < 8)
这样放不放的下1000个?
如果只放8个的那个要放125个可以够1000,25*25的可以放 12 * 12 = 144个,所以完全够用。
害,我好菜啊啊
#include<algorithm>
#include<iostream>
#include <cstdio>
#include <string>
#include <queue>
#include <cstring>
#include <map>
#include <stack>
#include <bitset>
#include <set>
#include <random>
// #include <unordered_set>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<double,double> pdd;
typedef unsigned long long ull;
// typedef unordered_set<int>::iterator sit;
#define st first
#define sd second
#define mkp make_pair
#define pb push_back
void tempwj(){
freopen("P2633_1.in","r",stdin);freopen("P2633_1.out","w",stdout);}
ll gcd(ll a,ll b){
return b == 0 ? a : gcd(b,a % b);}
ll qpow(ll a,ll b,ll mod){
a %= mod;ll ans = 1;while(b > 0){
if(b & 1)ans = ans * a % mod;a = a * a % mod;b >>= 1;}return ans;}
struct cmp{
bool operator()(const pii & a, const pii & b){
return a.second > b.second;}};
int lb(int x){
return x & -x;}
//friend bool operator < (Node a,Node b) 重载
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const ll mod = 1e9+7;
const int maxn = 5005+10;
const int M = 1e6 + 2;
char a[50][50];
int main()
{
int T;
scanf("%d",&T);
while(T -- )
{
int n;
scanf("%d",&n);
if(n <= 24)
{
printf("1 %d\n",(n + 1) / 2 * 2 + (n % 2 == 0));
for (int i = 1; i <= (n + 1) / 2; i ++ )
printf("X.");
if(n % 2 == 0)
printf("X");
printf("\n");
continue;
}
for (int i =1; i <= 25; i ++ )
{
for(int j = 1; j <= 25; j ++ )
a[i][j] = '.';
}
int k = 0;
for (; k <= 8; k ++ )
{
if((n - 3 * k) % 8 == 0)
{
break;
}
}
int s= (n - 3 * k) / 8;
for (int i = 2; i <= 24; i += 2)
{
if(s == 0)
break;
for (int j = 2; j <= 24; j += 2)
{
if(s == 0)
break;
a[i][j] = 'X';
s -- ;
}
}
printf("%d %d\n",25,25);
for (int i = 25;k > 0 && i >= 1; i --, k -- )
{
a[25][i] = 'X';
}
for (int i = 1; i <= 25; i ++ )
printf("%s\n",a[i] + 1);
}
}