2020牛客寒假算法基础集训营3B.牛牛的DRB迷宫II
思路:
一开始我是考虑全部都是B会怎么样,然后删改,结果到后面发现很难推到普遍规律(可能是因为我没看出来)。
看了题解之后,觉得这题出的挺有意思。
B D 1 1
R B D 1 2 2
R B D 2 4 4
R B D 4 8 8
R B D 8 16 16
R B D 16 32 32
可以发现对角线上的R是二进制数。
我们可以先构建原图:
BDDDDDD
RBDDDDD
DRBDDDD
DDRBDDD
DDDRBDD
DDDDRBD
DDDDDRB
然后如果k的二进制位为1,就将那一位的R变成B,最后再输出一行R。
注意0要改成1e9+7。
代码:
#include<bits/stdc++.h>
#define pii pair<int,int>
#define ll long long
#define cl(x,y) memset(x,y,sizeof(x))
#define ct cerr<<"Time elapsed:"<<1.0*clock()/CLOCKS_PER_SEC<<"s.\n";
const int N=1e6+10;
const int mod=1e9+7;
const int maxn=0x3f3f3f3f;
const int minn=0xc0c0c0c0;
const int inf=99999999;
using namespace std;
char maze[60][60];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int k,n,m,i,j;
cin>>k;
if(k==0)
k=mod;
for(i=1;i<=31;i++)
for(j=1;j<=31;j++)
{
if(i==j)
maze[i][j]='B';
else if(i-j==1)
maze[i][j]='R';
else
maze[i][j]='D';
}
int p=1;
while(k)
{
if(k&1)
maze[p+1][p]='B';
p++;
k>>=1;
}
cout<<p<<" "<<p-1<<endl;
for(i=1;i<p;i++)
{
for(j=1;j<p;j++)
cout<<maze[i][j];
cout<<endl;
}
for(i=1;i<p;i++)
cout<<"R";
return 0;
}