关于构造和二进制,题目:牛牛的DRB迷宫Ⅱ(源自牛客竞赛2020年寒假集训)
关于构造和二进制,题目:牛牛的DRB迷宫Ⅱ(源自牛客竞赛2020年寒假集训)
题目:
链接:https://ac.nowcoder.com/acm/contest/3004/B 来源:牛客网
题目描述 牛牛有一个n*m的迷宫,对于迷宫中的每个格子都为’R’,‘D’,'B’三种类型之一,'R’表示处于当前的格子时只能往右边走’D’表示处于当前的格子时只能往下边走,而’B’表示向右向下均可以走。
我们认为迷宫最左上角的坐标为(1,1),迷宫右下角的坐标为(n,m),除了每个格子有向右移动以及向下移动的限制之外,你也不能够走出迷宫的边界。
牛牛现在请你设计迷宫,但是要求你设计的迷宫符合他的要求,他要求你设计的迷宫从(1,1)节点移动到(n,m)节点不同的移动序列种类数目≡k%1e9+7。
请你构造出符合条件的DRB迷宫,但是要求你输出的迷宫的大小不超过50*50,具体输出格式见输出描述及样例。
如果存在多解你可以构造任意符合条件的迷宫,反之如果无解,请输出一行一个字符串"No solution"。
输入描述: 仅一个整数k,你需要构造一个DRB迷宫符合从左上走到右下的方案数≡k%1e9+7。 输出描述: 请你构造出符合条件的DRB迷宫,但是要求你输出的迷宫的大小不超过50*50。
第一行输出n,m两个整数,中间用空格隔开。 接下来n行,每行输出一个大小为m的字符串,字符串只能包含大写字母’D’,‘R’,‘B’。 如果存在多解你可以构造任意符合条件的迷宫,反之如果无解,请输出一行一个字符串"No solution"。 示例1 输入 复制 25 输出 复制 5 5 RBBBR BBBBB BBBDB BDBBB RBBBB
≡为同余等号,意为等式两边在对模数取余后的结果相同。 本题为Special Judge类型,只要符合题目要求的答案均可通过。
答案很自♂由,但是很懵逼,我一开始也不会做这道题,琢磨了很久的题解,也没搞明白,具体因为什么没有搞明白,我觉得是因为图不够生动吧,不可能是因为我太菜的。
其实不需要太多话,这道题的核心就在一张图上了,就拿样例,25。
质朴的绘图工具,Excel。。。。
首先咱们看高亮部分,很容易看出,最中间一条是由B组成的,D在B上♂面,R在B下♂面,那么每一个B可以去右边和下面,而D向下传递,R向右传递,也就是每一个B可以由上一个B通过两条不同的路径传过来。
如图
来吧,巨丑无比的图,这张图调用了全新的软件 ps,半夜了,明天还要上课,懒得好好做图了,凑活看吧
可见,从左上角的B移动到右下角的B都是蓝黑两条路径,那么简单的乘法,第i行的B可以到达的方法就是2^i。那么从这个B迁移到下面的一个R 的方法数是一样的。
也就是说每一个R对应上面的B,两者的方法数是一样的。有没有二进制既视感?
接下来就该下面的D上场了。
突然发现上面图片有一个地方搞错了
应该是R4哈,别在意那些细节了。
下面的D有什么特色呢?全部都是D,方法数全部都只能向下传递,而且只有一种方法,他们不生产方法,只做方法数的搬运工。
但是问题来了,D上面都被R给覆盖了,R往右传递到了B关下面的D什么事呢?
这就是这道题的解法核心了。
如果把某个R变成B了,那是不是认为,它还是一个R,但是,把它2和下面的一列D组成的高速公路接通了,它的方法数能够原封不动的通过下面的D一直向下传递,直到到达图的最下方。
这样,就相当于在一个水管子上,另外开凿出来一个分叉,不影响原来的,只把分叉口的水另外接出来。既能维持原来的2^i关系不变,又能将当前点的方法数的值传递导出来,传递下去,接着:
轮到最下面的一行R了。
可见黄色部分,最后一个R和B的方法数,没有地方传递了,水管子断掉了,水也撒了。在最后一个B下面是一个R,再下面是一个D,那么最下面的R,不会接收到来自该点上方的方法数传递下来,只能接受到左侧的方法数传递过来。
这是我的程序用样例25构造出来的图,第1,4,5列的R变成了B,这正好是25的二进制表示11011。
那么第一列的B,将方法数1顺着一列的D传递下来,而第4,5列的B也同样,将8和16传递下来,其他列,由于R不具备向下传递的能力,所以清一色全是D。
那么传到最底下的R上,一个R接受上面的D传下来的1,第二个R接收左边传来的1和上面传下来的0,仍然是1,第3个还是1,直到第四个,接收左边的1和上面的8变成9,第五个变成25,一直往右传递,数值不在变化,那么,整个图最右下角的一个点,不正是输入的数字25吗?
压缩一下,就长这个亚子。最上面的一行代表每一个B对应的数字,下面的一行R,红色代表不向下传递,不连通,而R变成B,也就向下连通,变成蓝色。
最下面的一行就是底层的R,接受从左侧传来的数值和上方蓝色通道传来的数值,对数值求和继续向右传递。
我觉得我讲的应该够清晰了,再看不懂的是不是比我还菜了
关于构造和二进制,题目:牛牛的DRB迷宫Ⅱ(源自牛客竞赛2020年寒假集训)相关推荐
- (构造+二进制)2020牛客寒假算法基础集训营3B.牛牛的DRB迷宫II
2020牛客寒假算法基础集训营3B.牛牛的DRB迷宫II 思路: 一开始我是考虑全部都是B会怎么样,然后删改,结果到后面发现很难推到普遍规律(可能是因为我没看出来). 看了题解之后,觉得这题出的挺有意 ...
- 2020牛客寒假算法基础集训营3 B 牛牛的DRB迷宫II二进制详解
2020牛客寒假算法基础集训营3 B 牛牛的DRB迷宫II B 牛牛的DRB迷宫II 输入: 25 输出: 5 5 RBBBR BBBBB BBBDB BDBBB RBBBB 题解 由图求方案数,我们 ...
- 2020牛客寒假算法基础集训营3 A.牛牛的DRB迷宫I
2020牛客寒假算法基础集训营3 A.牛牛的DRB迷宫I 题目描述 牛牛有一个n*m的迷宫,对于迷宫中的每个格子都为'R','D','B'三种类型之一,'R'表示处于当前的格子时只能往右边走'D'表示 ...
- 牛牛的DRB迷宫II(构造)
题目链接 代码: #include<iostream> char ma[55][55]; using namespace std; const int mod=1e9+7; int mai ...
- 棋盘dp 牛牛的DRB迷宫I
题目链接 如果当前字符为R,那么dp[i][j+1]=dp[i][j]+dp[i][j+1] 如果当前字符为D,那么dp[i+1][j]=d[i][j]+dp[i+1][j] 如果当前字符为B,那么两 ...
- 牛牛和DRB迷宫Ⅰ【动态规划】
题目描述:原题链接 解法:动态规划 思路: 用二维数组存图,初始化到(1,1)点的方案书为1,每次递归判断两次,向左还是向上. #include<bits/stdc++.h>using n ...
- 【20200208】【lyk】牛牛的DRB迷宫
题意 构造题.一个n*m的矩阵,每个格子可以是向右走(R).向下走(D)或者即可向右走也可向下走(B),求使从(1,1)走到(n,m)的不同走法mod1e9+7与k同余的图.n,m小于50,大小自定. ...
- 牛牛的DRB迷宫II
分析 代码 #include <cstring> #include <algorithm> #include <iostream> #include <vec ...
- A: 牛牛的DRB迷宫I (dp)
传送门 题意: 分析: 对于每个位置,看能不能从上,或者从左边到达,如果可以那就加上前面的方案数即可 代码: #include <iostream> #include <stdio. ...
最新文章
- python web开发框架flask_Python Web 开发框架,Flask 与 Django那个更好
- 当我们按下电源键,Android 究竟做了些什么?
- 谨慎的Waymo CEO:未来几十年,自动驾驶无法做到无处不在
- Android5.1.1 - zygote中获取系统服务时抛出异常
- MYSQL 获取当前日期及日期格式以及非空处理
- Testng生成的测试报告乱码解决办法
- CF1543C. Need for Pink Slips
- shell编程题(一)
- C++ 函数需要有返回值,但非全分支return(RVO)
- UE4官方文档链接记录
- 城市规划CAD影像底图快速导入方法
- SecureCRT中文乱码解决方法
- 小白如何入门计算机编程?
- 用友NC单据UI基本代码示例
- 操作系统实验Ucore:Kernel_init(四)
- YTU OJ 3094: 善良的小乌龟
- 黑鹰ASP.NET教程
- dlink 备份文件_dlink基本配置命令
- 三王乱战孙宇晨背后:我们需要一场的区块链真理大辩论
- View UI中textarea字数统计不变问题