2020杭电多校第十场1003(HDU 6879)

Mine Sweeper(扫雷)

2020杭电多校第十场1003(HDU 6879)_第1张图片
玩过扫雷的(不会还有人没玩过扫雷吧,不会吧不会吧 )都知道,地图中显示的数字代表这个数字的周围有多少个地雷。题意很简单,就给一个数n,让你构造一个布雷的地图,使图中的每个数字的和为n
我们只要先把地图的所有格子都埋下雷,然后一个一个挖出来。很容易知道地图中的数字最大只可能是8,也就是周围所有格子都是雷。我们只要把n整除8,得到t代表中间挖掉的雷的个数,把n mod 8,得到的m用来处理边角(至于为什么就不用我赘述了吧)。
2020杭电多校第十场1003(HDU 6879)_第2张图片
--------------------------上图为周围都是雷的情况----------------------------
要注意的是,n比较小的时候要单独拿出来做,聪明的你一定能想到为什么(所以我也不多说了)。
下面贴代码

#include
using namespace std ;
typedef long long ll;
const int maxn = 50;
int n ;
int mp[maxn][maxn] ;
int main(){
	int T;
	cin>>T;
	while(T--)
	{
		scanf("%d",&n);
		memset(mp,0,sizeof mp) ;
		if(n < 25){
			printf("1 %d\n",n+1) ;
			for(int i = 1; i <= n+1 ; i++){
				if(i&1)
					printf("X") ;
				else printf(".") ;
			}
			printf("\n") ;
		}
		else{
			double sum = n / 8 ;
			int xlen = sum / 12 ;
			int c = n % 8 ;
			printf("25 25\n") ;
			for(int i = 1 ; i <= xlen ; i++){
				for(int j = 1 ; j <= 12 ; j++)
					mp[i*2][j*2] = 1 ;
			}
			if(xlen * 12 < sum){
				int  y = sum - xlen * 12 ;
				for(int i = 1 ; i <= y ; i++)
					mp[xlen*2+2][2*i] = 1 ;
			}
              //下面处理边角
			if(c == 1) mp[1][1] = 1 ;
			else if(c== 2) mp[1][1] = mp[1][2] = 1 ;
			else if(c == 3)  mp[25][1] = 1 ;
			else if(c == 4) mp[1][1] =mp[25][1] = 1 ;
			else if(c == 5) mp[25][2] = 1 ;
			else if(c == 6) mp[25][25] = mp[25][1] = 1 ;
			else if(c == 7) mp[1][1] =mp[25][25] = mp[25][1] = 1  ;
			for(int i = 1 ; i <= 25 ; i++){
				for(int j = 1 ; j <= 25 ; j++){
					if(mp[i][j])
						printf(".") ;
					else
						printf("X") ;
				}
				printf("\n") ;
			}
		}
	}
	return 0 ;
}

水平和文笔拙劣,请见谅qwq,也请dalao们多多帮忙嘤嘤嘤~~~

你可能感兴趣的:(2020杭电多校第十场1003(HDU 6879))