結果
| 問題 |
No.3 ビットすごろく
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2018-06-09 13:48:28 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,518 bytes |
| コンパイル時間 | 650 ms |
| コンパイル使用メモリ | 73,108 KB |
| 実行使用メモリ | 13,888 KB |
| 最終ジャッジ日時 | 2024-06-30 12:33:31 |
| 合計ジャッジ時間 | 11,324 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 5 TLE * 1 -- * 27 |
ソースコード
#include <iostream>
#include <utility>
#include <queue>
#include <set>
typedef std::pair<int, int> Grid;
typedef std::queue<Grid> GridQueue;
int getOneBitNumber(int n) {
int count = 0;
while (n > 0) {
if (n % 2 == 1) {
count++;
}
n = n / 2;
}
return count;
}
int solve(GridQueue& grid_queue, int n) {
std::set<int> memo;
while (!grid_queue.empty()) {
auto tmp_grid = grid_queue.front(); grid_queue.pop();
if (tmp_grid.first == n) return tmp_grid.second;
memo.insert(tmp_grid.first);
int moving_grid = getOneBitNumber(tmp_grid.first);
int moved_grid[2] = {tmp_grid.first-moving_grid, tmp_grid.first+moving_grid};
for (int i = 0; i < 2; i++) {
if (moved_grid[i] > 0 && moved_grid[i] < n+1) {
bool gone_flag = false;
for (auto memo_list : memo) {
if (memo_list == moved_grid[i]) {
gone_flag = true;
break;
}
}
if (!gone_flag) {
Grid new_grid(moved_grid[i], tmp_grid.second+1);
grid_queue.push(new_grid);
}
}
}
}
return -1;
}
int main(int argc, char const* argv[]) {
int N;
Grid grid(1, 1);
GridQueue grid_queue;
grid_queue.push(grid);
std::cin >> N;
int ans = solve(grid_queue, N);
std::cout << ans << std::endl;
return 0;
}