• 模拟栈的回溯,完全二叉树搜索,(ZOJ1004)


    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1004

    解题报告:

    ①方法:完全二叉树的搜索方式,回溯法。

    ②代码解释:

    1、可以一直入栈,当不能入栈的时候,就只能出栈了。

    2、先入栈,再出栈。保证堆栈弹出的时候不为空。

    3、当dfs(i,j)完成之后(i>1),可以进行出栈操作的时候,进行dfs(i,j+1),来逼近答案。

    #include <iostream>
    #include <string>
    #include <algorithm>
    #include <stack>
    #include <vector>
    
    using namespace std;
    
    string a,b;///原单词和目标单词;
    
    stack <char> build;///构造目标字符串
    vector <char> operate;///记录出入栈操作
    int len;///字符串a长度
    
    
    ///iPush表示入栈操作的次数,iPop表示出栈操作的次数;
    void dfs(int iPush,int iPop)
    {
        ///当出入栈操作的次数刚好等于字符串长度时,目标单词构造完成。
        if(iPush==len&&iPop==len)
        {
            for(int i=0;i<operate.size();i++)
                cout<<operate[i]<<" ";
            cout<<endl;
        }
        ///入栈操作;
        if(iPush+1<=len)
        {
            build.push(a[iPush]);
            operate.push_back('i');
            dfs(iPush+1,iPop);
            build.pop();
            operate.pop_back();
        }
        ///出栈操作;
        if(iPop+1<=iPush&&iPop+1<=len&&build.top()==b[iPop])
        {
            char tc=build.top();
            build.pop();
            operate.push_back('o');
            dfs(iPush,iPop+1);
            build.push(tc);
            operate.pop_back();
        }
    }
    
    
    int main()
    {
        while(cin>>a>>b)
        {
            len=a.length();
            cout<<"["<<endl;
            dfs(0,0);
            cout<<"]"<<endl;
        }
        return 0;
    }
  • 相关阅读:
    docker 安装 nexus3 初始密码不再是admin123
    eclipse中Tomcat修改项目名称
    WAMP3.1.3自定义根目录
    git学习笔记
    小米和MAC触摸板手势汇总
    IDEA快捷键汇总
    servelet 实现Post接口访问
    LeetCode:Jump Game II
    LeetCode:Trapping Rain Water
    LeetCode: Container With Most Water
  • 原文地址:https://www.cnblogs.com/TreeDream/p/5308788.html
Copyright © 2020-2023  润新知