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(".");
}
}

浙公网安备 33010602011771号