寒假集训3 B.牛牛的DRB迷宫II(二进制构造)

题目链接:https://ac.nowcoder.com/acm/contest/3004/B
寒假集训3 B.牛牛的DRB迷宫II(二进制构造)_第1张图片寒假集训3 B.牛牛的DRB迷宫II(二进制构造)_第2张图片
这道题目我感觉很难语言表述清楚,我也是看了很久的题解和别人写的题解才明白,只能自己慢慢理解,太难想了
寒假集训3 B.牛牛的DRB迷宫II(二进制构造)_第3张图片
这是我看到一个同学写的,看到这个我才突然明白,为什么m要等于30,在这里插入图片描述
如果第i位上为1,则其下面一个必定为B(a[i+1][i]==‘B’),让它可以从下面一排直接过去,因为只有这样才可以让2^i处为1。
如果不为1,说明没有单独的2^i存在,那么直接让它下面一个为R即可,用来贡献下一个2的(i+1)次方。要注意,对a[m+1][m]的理解。

#include
#include
using namespace std;

int main()
{
	int n=32,m=30;
	char a[35][35];
	int k;
	cin>>k;
	for(int i=1;i<=n-1;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(j<i-1)        a[i][j]='D';
			else if(j<i+2)   a[i][j]='B';
			else             a[i][j]='R';
		}
	}
	for(int i=1;i<=m;i++)
	{
		if(!(k&(1<<(i-1))))  a[i+1][i]='R';
		a[n][i]='R';
	}
	cout<<n<<" "<<m<<endl;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		    cout<<a[i][j];
		cout<<endl;
	}
	return 0;
}


你可能感兴趣的:(牛客网寒假算法基础训练营)