#include #include using namespace std; int binary_convert(int i){ if(i <= 1){ return i; } int ret = 0; vector a; while(i >= 2){ a.insert(a.begin(), i % 2); i /= 2; } a.insert(a.begin(), i); for(int i = 0; i < a.size(); i++){ ret += a.at(i) * pow(10, a.size() - i - 1); } return ret; } vector visited; // たどり着くとそこまでにかかった回数、たどり着けなければ-1を返す int dfs(vector &boxes, int ¤t_index, int &ans, vector &visited){ visited.at(current_index) = true; bool impossible = true; if(boxes.size() == 1){ return 0; } for(int i = 0; i < visited.size(); i++){ if(visited.at(i) == false){ impossible = false; break; } } if(impossible){ return -1; } if(current_index == boxes.size() - 1){ return ans; } if(current_index > boxes.size() - 1 || current_index < 0){ return -1; } for(int i = -1; i <= 1; i += 2){ current_index += boxes.at(current_index) * i; ans++; dfs(boxes, current_index, ans, visited); } } int main() { int N; cin >> N; vector boxes(N); for(int i = 0; i < N; i++){ int a = binary_convert(i + 1); string a_str = to_string(a); int b = 0; for(int i = 0; i < a_str.size(); i++){ if(a_str[i] == '1'){ b++; } } boxes.at(i) = b; } int current_index = 0; int ans = 1; vector visited(N, false); visited.at(0) = true; cout << dfs(boxes, current_index, ans, visited) << endl; return 0; }