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

int GetTop(int N){
	int R = 0;
	while (N > 0){
		R = N % 10;
		N /= 10;
	}

	return R;
}
int GetTail(int N){
	return N % 10;
}
int GetDigit(int N){
	int R = 0;
	while (N > 0){
		N /= 10;
		R++;
	}

	return R;
}
/* * /
std::size_t SearchNDown(std::vector<int> vec, int N,int WO=1){
	for (std::size_t i = vec.size() - 1; i > 0; i--){
		if (vec[i] == 1) continue;
		if (GetTail(N) == GetTop(i)){
			//if (GetTail(i) == GetTop(WO) && GetDigit(i) > 1) continue;
			return i;
		}
	}

	return 0;
}
/* */
std::size_t SearchNUp(std::vector<int> vec, int N){
	for (std::size_t i = 0; i < vec.size(); i++){
		if (vec[i] == 1) continue;
		if (GetTail(N) == GetTop(i)){
			return i;
		}
	}

	return 0;
}
std::vector<int> Siritori(std::vector<int> vec,std::size_t Start = 1){
	std::size_t S = Start;
	std::vector<int> ret;
	bool F = true;

	vec[S] = 1;
	ret.push_back(S);	

	while (S != 0){
		S = SearchNUp(vec, S);
		vec[S] = 1;
		ret.push_back(S);

	}
	//>-bad hack-<
	ret.pop_back();

	std::rotate(ret.begin(), ret.begin() + 2, ret.end());
	S = SearchNUp(vec, ret.back());
	if (vec[S] == 0) ret.push_back(S);
	vec[S] = 1;

	//>---------<

	std::cout << "NotUse:";
	for (std::size_t i = 0; i < vec.size(); i++){
		if (vec[i] == 0) std::cout << i << ',';
	}
	
	return ret;

}

std::vector<int> Mondai(int N){
	std::vector<int> vec(N+1);
	for (std::size_t j = 0; j < vec.size(); j++){
		if (GetTail(j) == 0) vec[j] = 1;
	}

	return vec;
}

int main(){

	auto R = Mondai(1001);
	int X = R.size()-1;
	X = 9;
	if (GetTail(X) == 0) X--;
	R = Siritori(R,X);

	std::cout <<std::endl<<"result:";
	for (auto& o : R) std::cout << o << ',';

	return 0;


}