本文主要是介绍杭电多校第10场 HDU6879 Mine Sweeper(构造),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题意:
扫雷游戏,要求你构造最多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;
}
这篇关于杭电多校第10场 HDU6879 Mine Sweeper(构造)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!