2020算法设计竞赛
https://ac.nowcoder.com/acm/contest/3004/B
构造题
构造A题中的迷宫,要求方案数整好等于给定的k,可以构造一个二进制编码器,斜对角线上的方案数恰好是1,2,3,4,8,16,32...,用二进制可以拼出所有的数字,所以一定能造的出来。
如图所示,斜对角线的R对应位置是二进制数,然后只要这一位有的话就可以直接把他变成B。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int mod=1e9+7; 4 int i,i0,n,m,ans,k; 5 char mp[55][55]; 6 int main() 7 { 8 n=32,m=30; 9 scanf("%d",&k); 10 mp[n][m]='B'; 11 for(int i0=1;i0<=m;i0++)mp[1][i0]=(i0<=2)?'B':'R'; 12 for(int i=2;i<=n-1;i++){ 13 for(int i0=1;i0<=m;i0++){ 14 if(i0<i-1)mp[i][i0]='D'; 15 else if(i0<i+2)mp[i][i0]='B'; 16 else mp[i][i0]='R'; 17 } 18 } 19 for(int i0=1;i0<=m;i0++){ 20 if(!(k&(1<<(i0-1)))) mp[i0+1][i0]='R'; 21 mp[n][i0]='R'; 22 } 23 printf("%d %d\n",n,m); 24 for(int i=1;i<=n;i++) printf("%s\n",mp[i]+1); 25 return 0; 26 }