NKOJ8427 扫雷带师


思路:其实是非常简单的一道题,之所以要写一写是因为我错得实在是过于伞兵。。。
首先,如果一个位置,它旁边的8个位置都没有地雷(且不在棋盘边缘),那么你在这个位置放一个地雷就会有8的贡献,这是显然的。
我们最多可以找到144个这样的位置,\(144*8=1152\),已经足够。那么对于一个S,我们只需要处理\(S%8\)的部分即可。
又想到当我们已经放好了这些地雷后,在棋盘边缘放地雷(即斜对角线均有地雷)只会有\(1\)的贡献。那么就行了。
但是有可能我们的\(S%8\)的地雷较多,比\(S/8\)的地雷还要多,怎么办呢?
这样的话\(S\leq64\)
首先想,\(S\leq24\)一行即可解决,即'x','.'交替放即可(谁先放没有影响)。
\(25\)\(63\)呢?用两行就行了,一个地雷会有\(5\)的贡献,另外一行也交替着放有\(1\)的贡献,可以满足。

#include <bits/stdc++.h>

using namespace std;

int main()
{
	int S;
	scanf("%d", &S);
	if (S <= 24) 
	{
		printf("%d %d\n", 1, S + 1);
		for (int i = 1; i <= S + 1; i++) if (i & 1) printf("."); else printf("x");
		return 0;
	}
	else if (S <= 63)
	{
		int maxx = S / 5, lim = S % 5;
		printf("%d %d\n", 2, maxx * 2 + 1);
		for (int i = 1; i <= maxx * 2 + 1; i++) if (i & 1) printf("."); else printf("x");
		printf("\n");
		for (int i = 1; i <= lim * 2; i++) if (i & 1) printf("x"); else printf(".");
		for (int i = lim * 2 + 1; i <= maxx * 2 + 1; i++) printf(".");
		return 0;
	}
	else
	{
		printf("25 25\n");
		int maxx = S / 8, lim = S % 8, flg;
		for (int i = 1; i <= lim * 2; i++) if (i & 1) printf("x"); else printf(".");
		for (int i = lim * 2 + 1; i <= 25; i++) printf(".");
		printf("\n");
		for (int i = 2; i <= 25; i++, printf("\n"))
		{
			for (int j = 1; j <= 25; j++)
			{
				if (j % 2 == 0 && i % 2 == 0)
				{
					if (maxx <= 0) printf(".");
					else if (maxx == 1) printf("x"), --maxx, flg = i + 1;
					else printf("x"), --maxx;
				} else printf(".");
			}
		}
		for (int i = flg; i <= 25; i++, printf("\n")) for (int j = 1; j <= 25; j++) printf(".");
	}
}
posted @ 2021-08-07 11:52  Chasing-Dreams  阅读(78)  评论(0)    收藏  举报