[BOJ]15655 NとN(6)(逆トラッキング)


1.質問


https://www.acmicpc.net/problem/15655

2.解法


1) ⭕RIGHT⭕

  • コード
  • #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    int N, M;
    vector<int> input;
    vector<int> v;
    bool visited[8];
    
    void backtracking(int level)
    {
    	if (level == M)
    	{
    		for (int i = 0; i < v.size(); ++i)
    			cout << v[i] << ' ';
    		cout << '\n';
    		return;
    	}
    	for (int i = 1; i <= N; ++i)
    	{
    		if (!visited[i]) {
    			if (v.empty() || input[i] >= v.back()) {
    				visited[i] = true;
    				v.push_back(input[i]);
    				backtracking(level + 1);
    				v.pop_back();
    				visited[i] = false;
    			}
    		}
    	}
    }
    
    int main() {
    	ios::sync_with_stdio(false);
    	cin.tie(NULL); cout.tie(NULL);
    
    	cin >> N >> M;
    	input.push_back(0);
    	for (int i = 0; i < N; ++i)
    	{
    		int tmp;
    		cin >> tmp;
    		input.push_back(tmp);
    	}
    	sort(input.begin(), input.end());
    
    	backtracking(0);
    	
    	return 0;
    }
  • その他の説明
    -NとM(2)の異なる部分
    与えられた数の中で条件を満たす数列を探す問題であるため,総アルゴリズムはNとM(2)に等しい.
    指定した数値を入力するベクトル入力を定義し、配列をソートして順番に参照します.
    ただし,1から訪問者の閲覧を開始するため,input[0]に最小値0を加え,sortとなっても影響を及ぼさない.