#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define ll long long #define PI acos(-1.0) #define FOR(I,A,B) for(int I = (A); I < (B); ++I) //方針 //2進数にした時の1の個数はbitsetか1<> N; int bit1[N+1]; FOR(i, 0, N+1){ bit1[i] = __builtin_popcount(i); } //quに次に始点となるマス番号を保存 queue qu; qu.push(1); //マスまで行くための最小値初期はINF int d[N+1]; int INF = 99999999; fill(d, d+N+1, INF); d[1] = 0; while(!qu.empty()){ //今見ている場所 int now_x = qu.front(); qu.pop(); //Nに着いてたら次は調べない if(now_x == N) continue; //次に見る場所の候補 int next_x1 = now_x + bit1[now_x]; int next_x2 = now_x - bit1[now_x]; //次見る場所が1~Nの中にあるかどうか if(next_x1 >= 1 && next_x1 <= N){ //短い経路だったら次も調べる if(d[next_x1] > d[now_x] + 1){ qu.push(next_x1); d[next_x1] = d[now_x] + 1; } } if(next_x2 >= 1 && next_x2 <= N){ if(d[next_x2] > d[now_x] + 1){ qu.push(next_x2); d[next_x2] = d[now_x] + 1; } } } cout << (d[N]==INF ? -1 : d[N]+1) << endl; }