杭电第十场 Mine Sweeper 构造

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
#include
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
// #include 
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::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);
	}
}


你可能感兴趣的:(做题笔记)