Cod sursa(job #2445772)

Utilizator red_devil99Mancunian Red red_devil99 Data 5 august 2019 14:40:11
Problema Submultimi Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.19 kb
#include <iostream>
#include <math.h>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

class Task {
 public:
	void solve() {
		read_input();
		print_output(get_result());
	}

 private:
	int n;
    std::vector<int> x;
	void read_input() {
		ifstream fin("submultimi.in");
		fin >> n;
		fin.close();
	}

	int Valid(int s){
	 x.resize(13);
     for(int i = 1; i <= s-1; i++){
        if(x[s] <= x[i]){
      return 0;
     }
  }
  return 1;
}
void Back(int s, std::vector<std::vector<int>>& all1, int k){
  x.resize(13);
    for(int i = 1; i <= n;i++){
    x[s] = i;
    if(Valid(s)){
      if(s == k){
        all1.push_back(x);
      }else{
        Back(s+1, all1, k);
      }
    }
  }
  
}

void re(std::vector<std::vector<int>>& v, int k){
      for(int i = 0; i < v.size(); i++){
			v[i].erase(v[i].begin());
			v[i].resize(k);
		}
}
bool nr_poz(std::vector<int>& v, std::vector<int>& v1){
	int ok = 0;
    for(int i = 0; i < std::min(v.size(), v1.size()); i++){
    	if(v[i] > v1[i]){
           ok = 1;
           break;
    	}
    }
    if(ok == 1){
    	return true;
    }

    return false;
    
}


	vector<vector<int> > get_result() {
		vector<vector<int>> all;
		vector<vector<int> > interm;
		std::vector<int> poz;

		/*
		TODO: Construiti toate submultimile multimii {1, ..., N}.

		Pentru a adauga o noua submultime:
			vector<int> submultime;
			all.push_back(submultime);
		*/
			for(int i = 1; i <= n; i++){
				Back(1, interm, i);
				re(interm, i);
				for(int j = 0; j < interm.size(); j++){
					all.push_back(interm[j]);
				}
				interm.clear();
				
				
			}
      
		for(int i = 0; i < all.size()-1; i++){
			for(int j = 0; j < all.size()-i-1; j++){
			if(nr_poz(all[j], all[j+1])){
				std::vector<int> temp = all[j];
				all[j] = all[j+1];
				all[j+1] = temp;
			}
			
		 }
		}

		
		

		return all;
	}

	void print_output(vector<vector<int> > result) {
		ofstream fout("submultimi.out");
		fout << result.size() + 1 << '\n';
		for (int i = 0; i < (int)result.size(); i++) {
			for (int j = 0; j < (int)result[i].size(); j++) {
				fout << result[i][j] <<
					(j + 1 != result[i].size() ? ' ' : '\n');
			}
		}
		fout.close();
	}
};

int main() {
	Task task;
	task.solve();
	return 0;
}