题意:
扫雷游戏,要求你构造最多25*25大的棋盘,合理的放置雷,使得每个位置的权值和为n(n≤1000)。每个位置的权值为周围8个位置雷的数量,雷的权值为0。
思路:
考虑依次间隔的放雷,那么每个雷的贡献就是8。
那么最后可以弄成8x+y的形式。
我们依次的凑,可以在全图里凑出这些3 5 6 7 11这几个数。
在部分图里凑出1 2 3 4 5 6 7这几个数。
当n≤7的时候,按照部分图的样子直接输出。
当n≥8的时候,表示成n=8x+y,按照余数分配一下就好了
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
char a[30][30];
void Print() {
for(int i = 1;i <= 25;i++) {
for(int j = 1;j <= 25;j++) {
if(a[i][j] == 'X') printf("%c",a[i][j]);
else printf(".");
}
printf("\n");
}
}
int main() {
int T;scanf("%d",&T);
while(T--) {
memset(a,0,sizeof(a));
int n;scanf("%d",&n);
if(n == 1) printf("1 2\nX.\n");
else if(n == 2) printf("1 3\n.X.\n");
else if(n == 3) printf("2 2\n..\nX.\n");
else if(n == 4) printf("2 2\nX.\nX.\n");
else if(n == 5) printf("2 3\n...\n.X.\n");
else if(n == 6) printf("2 3\n...\nXX.\n");
else if(n == 7) printf("3 3\n...\nX..\nXX.\n");
else {
printf("25 25\n");
int num1 = n / 8, num2 = n % 8;
if(num2 == 1) {
num1--;
a[25][1] = 'X';
a[25][25] = a[25][24] = 'X';
} else if(num2 == 2) {
num1--;
a[25][1] = 'X';
a[25][25] = a[25][24] = a[24][25] = 'X';
} else if(num2 == 3) {
a[25][1] = 'X';
} else if(num2 == 4) {
num1--;
a[25][1] = a[25][2] = 'X';
a[25][25] = a[25][24] = 'X';
} else if(num2 == 5) {
a[25][2] = 'X';
} else if(num2 == 6) {
a[25][1] = a[25][2] = 'X';
} else if(num2 == 7) {
a[25][25] = a[25][24] = a[24][25] = 'X';
}
for(int i = 2;i <= 25;i += 2) {
for(int j = 2;j <= 25;j += 2) {
if(num1) a[i][j] = 'X';
else break;
num1--;
}
}
Print();
}
}
return 0;
}