题解 | #火车进站#

火车进站

https://www.nowcoder.com/practice/97ba57c35e9f4749826dc3befaeae109

//https://www.nowcoder.com/practice/97ba57c35e9f4749826dc3befaeae109?tpId=37&rp=1&ru=%2Fexam%2Foj%2Fta&qru=%2Fexam%2Foj%2Fta&sourceUrl=%2Fexam%2Foj%2Fta%3Fpage%3D1%26pageSize%3D50%26search%3D50%26tpId%3D37%26type%3D37&difficulty=&judgeStatus=&tags=&title=%E7%81%AB%E8%BD%A6&gioEnter=menu

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

class Solution{
public:
    void backtrack(int layer){

//        cout << "layer:" << layer << endl;
//
//        cout << "flag:";
//        for(const int &i:flag)
//            cout << i;
//        cout << endl;
//
//        cout << "_flag:";
//        for(const int &i:_flag)
//            cout << i;
//        cout << endl;
//
//        cout << tem <<endl;


        if(layer==n){
            ans.push_back(tem);
        }
        else
            for(int i = 0;i<n;i++){
                if(layer==0){
                    tem.push_back(num[i]);  //string¿Épush_back char
                }
                else
                    if(_flag[i]==1){
                        tem.push_back(num[i]);
                    }
                if(tem.size()==layer+1){    //size()返回值类型为ll
                    flag[i] = 1;
                    _flag.assign(n, 0);
                    for(int j = i-1;j>=0;j--){
                            if(flag[j]!=1){
                                _flag[j]=1;
                                break;
                            }

                        }
                    for(int j = i+1;j<n;j++)    //逻辑运算提前有风险,可能会提前结束循环
                            if(flag[j]!=1)
                                _flag[j]=1;

                    backtrack(layer+1); //回溯法注意不要改变层数的值

                    tem.pop_back();
                    flag[i] = 0;
                    _flag.assign(n, 0);
                    if(layer!=0){
                    int tag = find(num.begin(), num.end(), tem.back())-num.begin();
                    for(int j = tag-1;j>=0;j--){
                            if(flag[j]!=1){
                                _flag[j]=1;
                                break;
                            }
                        }
                    for(int j = tag+1;j<n;j++)
                            if(flag[j]!=1)
                                _flag[j]=1;

//                    cout << "!!flag:";
//        for(const int &i:flag)
//            cout << i;
//        cout << endl;
//
//        cout << "!!_flag:";
//        for(const int &i:_flag)
//            cout << i;
//        cout << endl;
//        cout << tem <<endl;

                    }
                }
        }

    }

    Solution(int _n){
        n = _n;
        num.resize(n, 0);
        flag.resize(n, 0);
        _flag.resize(n, 0);

        for(int i = 0;i<n;i++)
            cin >> num[i];
    }

    void out(){
        sort(ans.begin(), ans.end());
        for(const string &s:ans){
            for(const char &c:s)
                cout << c << ' ';
            cout << endl;

        }
    }

private:
    vector<string> ans;
    vector<char> num;
    vector<int> flag;
    vector<int> _flag;
    string tem;
    int n = 0;

};

int main() {
    int n = 0;

    while(cin >> n){
        Solution s(n);
        s.backtrack(0);
        s.out();
    }

}

全部评论

相关推荐

喜欢吃蛋糕仰泳鲈鱼是我的神:字节可以找个hr 给你挂了,再放池子捞
点赞 评论 收藏
分享
头像
10-16 09:58
已编辑
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务