UVA11988_Broken Keyboard (a.k.a. Beiju Text)

来源:互联网 发布:ubuntu 16.04 安装 编辑:程序博客网 时间:2024/05/17 09:20

即将dfs()放到打印本段字符的后面

不过汝佳书上面说是用链表写的,无意中用递归写出来了,而且写的挺简单的,代码不复杂,写这个博客主要是想记住递归这种神奇的方法

平时递归搜索时候,dfs()的在其他代码的前后不同会有不同的效果,还有就是在递归前标记某一个,递归后消除这个标记(最经典的是暴力枚举排序)

在递归中也会经常遇到边递归边打印或者是全部递归之后再打印,这些各有不同

而这道题目就充分利用这个特点:递归强行的将一个代码片段或一个操作的执行顺序改变


这个题目其实不难,大概意思就是按了一个[ 就在插入到最前面开始写, 遇到一个]就插入到最后写 :[移动光标到最前面 ] 移动光标到最后面

这样的话模拟一下,就会发现操作具有后效性

在前面的 [ 或者 ] 并不表示最前或者是最后 , 但如果从后面读入操作的话,  比如:

This_is_a_[Beiju]_text

最后一个 ] 所接的字符一定是放在最后打印的,  那么我们现在假设" _text"最后这一段已经打印好了放在最后面了, (不会因为前面的操作而改变:后效性)  

那么现在打印剩下的字符  "This_is_a_[Beiju"

.那么如何保证剩下的字符一定在打印好的字符前面呢????

只要把打印剩下字符的代码放到 前面就好. 便是将dfs()放到打印"_text"的前面

同理: 遇到 [  怎么办呢??要确保[之后的字符一定在剩余字符的最前面 :

("Beiju" 一定要在剩余字符"This_is_a_["的前面)

只要把dfs()放到打印"This_is_a_" 的前面就可以了,就这样一直下去直到打印结束




#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<string>#include<queue>#include<cstdlib>#include<algorithm>#include<stack>#include<map>#include<queue>using namespace std;string ss;void print(int s,int e){    for(int i=s;i<=e;i++) printf("%c",ss[i]);}void dfs(int y){    for(int i=y;i>=0;i--){        if(ss[i]=='['){            print(i+1,y);//遇到[向前的 那就先把i+1到y的片段打印出来,再去打印0~i-1的
            dfs(i-1);//这样字符段的字符段i+1~y的,在一个可打印区间的最前面            break;//"可打印区间"想说的是在这个片段之前可能已经有递归前打印好放在了前面        }        else if(ss[i]==']'){            dfs(i-1);            print(i+1,y);            break;        }        if(i==0) print(0,y);     }}int main(){    while(getline(cin,ss)){        dfs((int)(ss.size()-1));        cout<<endl;    }    return 0;}

0 0
原创粉丝点击