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

Mine Sweeper(扫雷) 2020杭电多校第十场1003(HDU|2020杭电多校第十场1003(HDU 6879)
文章图片

玩过扫雷的(不会还有人没玩过扫雷吧,不会吧不会吧 )都知道,地图中显示的数字代表这个数字的周围有多少个地雷。题意很简单,就给一个数n,让你构造一个布雷的地图,使图中的每个数字的和为n。
我们只要先把地图的所有格子都埋下雷,然后一个一个挖出来。很容易知道地图中的数字最大只可能是8,也就是周围所有格子都是雷。我们只要把n整除8,得到t代表中间挖掉的雷的个数,把n mod 8,得到的m用来处理边角(至于为什么就不用我赘述了吧)。
2020杭电多校第十场1003(HDU|2020杭电多校第十场1003(HDU 6879)
文章图片

--------------------------上图为周围都是雷的情况----------------------------
要注意的是,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){ inty = 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 ; }

【2020杭电多校第十场1003(HDU|2020杭电多校第十场1003(HDU 6879)】水平和文笔拙劣,请见谅qwq,也请dalao们多多帮忙嘤嘤嘤~~~

    推荐阅读