2020牛客寒假算法基础集训营3 B 牛牛的DRB迷宫II
https://ac.nowcoder.com/acm/contest/3004/B
利用二进制进行构造
假设一个方形迷宫,主对角线都是B,B上面一个位置是D,其余位置都是R
那么到第i行第i列的方案数就是2^i
所以方案数的二进制形式,如果第i位是1,那就需要第i行第i列这一格的贡献
将这一格下面的一个格改为B,这一列这一格下面剩下的都改成D
在方形迷宫的基础上,最后面再加一行,全都是R
这样上面的‘D’就能将2^i的贡献下传到最后一行,最后一行通过‘R’传到最后一个格子
#include<cstdio> using namespace std; #define N 31 int bit[N]; char a[N][N]; int main() { int n,m=0; scanf("%d",&n); if(!n) { printf("1 2\nDD"); return 0; } while(n) bit[m++]=n&1,n>>=1; for(int i=0;i<=m;++i) for(int j=0;j<m;++j) a[i][j]='R'; for(int i=0;i<m;++i) { a[i][i]='B'; if(i) a[i-1][i]='D'; } for(int i=0;i<m;++i) if(bit[i]) { a[i+1][i]='B'; for(int j=i+2;j<m;++j) a[j][i]='D'; } printf("%d %d\n",m+1,m); for(int i=0;i<=m;++i) printf("%s\n",a[i]); return 0; }