Submission #75822323
Source Code Expand
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 20;
const int EXIT_I = 0;
const int EXIT_J = N / 2; // 10
int a[N][N];
struct Conveyor {
int length;
vector<pair<int, int>> cells;
};
struct Operation {
int m;
int d;
};
vector<Conveyor> conveyors;
vector<Operation> operations;
// 盤面を回すシミュレーション
void rotate_conveyor(int m, int d) {
const auto& conv = conveyors[m];
int len = conv.length;
vector<int> vals(len);
for (int i = 0; i < len; ++i) {
vals[i] = a[conv.cells[i].first][conv.cells[i].second];
}
for (int i = 0; i < len; ++i) {
int next_idx = (i + d + len) % len;
a[conv.cells[next_idx].first][conv.cells[next_idx].second] = vals[i];
}
}
// 操作の記録と実行
void do_operation(int m, int d, int count) {
for (int c = 0; c < count; ++c) {
operations.push_back({m, d});
rotate_conveyor(m, d);
}
}
// 特定のコンベア上のターゲットを指定のインデックス位置まで回転させて持ってくる関数
void move_target_to_idx(int m, pair<int, int> target_pos, int goal_idx) {
const auto& conv = conveyors[m];
int current_idx = -1;
for (int i = 0; i < conv.length; ++i) {
if (conv.cells[i] == target_pos) {
current_idx = i;
break;
}
}
if (current_idx == -1 || current_idx == goal_idx) return;
int len = conv.length;
int diff = (goal_idx - current_idx + len) % len;
if (diff <= len / 2) {
do_operation(m, 1, diff);
} else {
do_operation(m, -1, len - diff);
}
}
// ターゲットの現在の座標を探す補助関数
pair<int, int> find_target(int target) {
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
if (a[i][j] == target) return {i, j};
}
}
return {-1, -1};
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int input_N;
if (!(cin >> input_N)) return 0;
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
cin >> a[i][j];
}
}
// 1. 正しいベルトコンベアの設置
for (int i = 0; i < N; i += 2) {
Conveyor conv;
conv.length = 2 * N;
for (int j = 0; j < N; ++j) conv.cells.push_back({i, j});
for (int j = N - 1; j >= 0; --j) conv.cells.push_back({i + 1, j});
conveyors.push_back(conv);
}
for (int j = 0; j < N; j += 2) {
Conveyor conv;
conv.length = 2 * N;
for (int i = 0; i < N; ++i) conv.cells.push_back({i, j});
for (int i = N - 1; i >= 0; --i) conv.cells.push_back({i, j + 1});
conveyors.push_back(conv);
}
int next_target = 0;
if (a[EXIT_I][EXIT_J] == 0) {
a[EXIT_I][EXIT_J] = -1;
next_target = 1;
}
const int GOAL_IDX_IN_ROW0 = 10;
// 2. 貪欲法 + 賢い先読み回収
while (next_target < N * N) {
pair<int, int> pos1 = find_target(next_target);
if (pos1.first == EXIT_I && pos1.second == EXIT_J) {
a[EXIT_I][EXIT_J] = -1;
next_target++;
continue;
}
// ステップA: ターゲット(T1)が属する縦ループを使って、行0まで運ぶ
int v_idx = 10 + (pos1.second / 2);
int v_goal_idx = -1;
for (int idx = 0; idx < conveyors[v_idx].length; ++idx) {
if (conveyors[v_idx].cells[idx].first == 0 && conveyors[v_idx].cells[idx].second == pos1.second) {
v_goal_idx = idx;
break;
}
}
move_target_to_idx(v_idx, pos1, v_goal_idx);
// 縦移動後のT1の位置を更新
pos1 = find_target(next_target);
// 🌟追加実装: ステップA2 (便乗計算付きの先読み)🌟
if (next_target + 1 < N * N) {
pair<int, int> pos2 = find_target(next_target + 1);
int v2_idx = 10 + (pos2.second / 2);
if (v2_idx != v_idx && pos2.first >= 2) {
// T1の横移動でどれだけシフトするかを計算
int t1_col = pos1.second;
int diff = (GOAL_IDX_IN_ROW0 - t1_col + 40) % 40;
int shift = (diff <= 20) ? diff : -(40 - diff);
// T2がそのままの場合のゴールへの距離
int t2_col = pos2.second;
int orig_dist = abs(GOAL_IDX_IN_ROW0 - t2_col);
orig_dist = min(orig_dist, 40 - orig_dist);
// T2がT1の横移動に便乗した場合のゴールへの距離
int new_t2_col = (t2_col + shift + 40) % 40;
int new_dist = abs(GOAL_IDX_IN_ROW0 - new_t2_col);
new_dist = min(new_dist, 40 - new_dist);
// 便乗することでT2がゴールに「確実に近づく」場合のみ上に引き上げる
if (new_dist < orig_dist) {
int v2_goal_idx = -1;
for (int idx = 0; idx < conveyors[v2_idx].length; ++idx) {
if (conveyors[v2_idx].cells[idx].first == 0 && conveyors[v2_idx].cells[idx].second == pos2.second) {
v2_goal_idx = idx;
break;
}
}
move_target_to_idx(v2_idx, pos2, v2_goal_idx);
}
}
}
// T1の位置を再取得
pos1 = find_target(next_target);
// ステップB: 「横ループ0」を使って搬出口まで運ぶ
move_target_to_idx(0, pos1, GOAL_IDX_IN_ROW0);
// 搬出完了
a[EXIT_I][EXIT_J] = -1;
next_target++;
}
// 3. 出力
cout << conveyors.size() << "\n";
for (const auto& conv : conveyors) {
cout << conv.length;
for (const auto& cell : conv.cells) cout << " " << cell.first << " " << cell.second;
cout << "\n";
}
cout << operations.size() << "\n";
for (const auto& op : operations) {
cout << op.m << " " << op.d << "\n";
}
return 0;
}
Submission Info
| Submission Time | |
|---|---|
| Task | A - Conveyor Design |
| User | itoito1234 |
| Language | C++23 (GCC 15.2.0) |
| Score | 773571605 |
| Code Size | 6410 Byte |
| Status | AC |
| Exec Time | 3 ms |
| Memory | 3764 KiB |
Judge Result
| Set Name | test_ALL | ||
|---|---|---|---|
| Score / Max Score | 773571605 / 15000000000 | ||
| Status |
|
| Set Name | Test Cases |
|---|---|
| test_ALL | test_0000.txt, test_0001.txt, test_0002.txt, test_0003.txt, test_0004.txt, test_0005.txt, test_0006.txt, test_0007.txt, test_0008.txt, test_0009.txt, test_0010.txt, test_0011.txt, test_0012.txt, test_0013.txt, test_0014.txt, test_0015.txt, test_0016.txt, test_0017.txt, test_0018.txt, test_0019.txt, test_0020.txt, test_0021.txt, test_0022.txt, test_0023.txt, test_0024.txt, test_0025.txt, test_0026.txt, test_0027.txt, test_0028.txt, test_0029.txt, test_0030.txt, test_0031.txt, test_0032.txt, test_0033.txt, test_0034.txt, test_0035.txt, test_0036.txt, test_0037.txt, test_0038.txt, test_0039.txt, test_0040.txt, test_0041.txt, test_0042.txt, test_0043.txt, test_0044.txt, test_0045.txt, test_0046.txt, test_0047.txt, test_0048.txt, test_0049.txt, test_0050.txt, test_0051.txt, test_0052.txt, test_0053.txt, test_0054.txt, test_0055.txt, test_0056.txt, test_0057.txt, test_0058.txt, test_0059.txt, test_0060.txt, test_0061.txt, test_0062.txt, test_0063.txt, test_0064.txt, test_0065.txt, test_0066.txt, test_0067.txt, test_0068.txt, test_0069.txt, test_0070.txt, test_0071.txt, test_0072.txt, test_0073.txt, test_0074.txt, test_0075.txt, test_0076.txt, test_0077.txt, test_0078.txt, test_0079.txt, test_0080.txt, test_0081.txt, test_0082.txt, test_0083.txt, test_0084.txt, test_0085.txt, test_0086.txt, test_0087.txt, test_0088.txt, test_0089.txt, test_0090.txt, test_0091.txt, test_0092.txt, test_0093.txt, test_0094.txt, test_0095.txt, test_0096.txt, test_0097.txt, test_0098.txt, test_0099.txt, test_0100.txt, test_0101.txt, test_0102.txt, test_0103.txt, test_0104.txt, test_0105.txt, test_0106.txt, test_0107.txt, test_0108.txt, test_0109.txt, test_0110.txt, test_0111.txt, test_0112.txt, test_0113.txt, test_0114.txt, test_0115.txt, test_0116.txt, test_0117.txt, test_0118.txt, test_0119.txt, test_0120.txt, test_0121.txt, test_0122.txt, test_0123.txt, test_0124.txt, test_0125.txt, test_0126.txt, test_0127.txt, test_0128.txt, test_0129.txt, test_0130.txt, test_0131.txt, test_0132.txt, test_0133.txt, test_0134.txt, test_0135.txt, test_0136.txt, test_0137.txt, test_0138.txt, test_0139.txt, test_0140.txt, test_0141.txt, test_0142.txt, test_0143.txt, test_0144.txt, test_0145.txt, test_0146.txt, test_0147.txt, test_0148.txt, test_0149.txt |
| Case Name | Status | Exec Time | Memory |
|---|---|---|---|
| test_0000.txt | AC | 2 ms | 3764 KiB |
| test_0001.txt | AC | 2 ms | 3700 KiB |
| test_0002.txt | AC | 2 ms | 3592 KiB |
| test_0003.txt | AC | 2 ms | 3644 KiB |
| test_0004.txt | AC | 2 ms | 3708 KiB |
| test_0005.txt | AC | 2 ms | 3544 KiB |
| test_0006.txt | AC | 2 ms | 3644 KiB |
| test_0007.txt | AC | 2 ms | 3664 KiB |
| test_0008.txt | AC | 2 ms | 3608 KiB |
| test_0009.txt | AC | 2 ms | 3712 KiB |
| test_0010.txt | AC | 2 ms | 3700 KiB |
| test_0011.txt | AC | 2 ms | 3540 KiB |
| test_0012.txt | AC | 2 ms | 3708 KiB |
| test_0013.txt | AC | 2 ms | 3596 KiB |
| test_0014.txt | AC | 2 ms | 3632 KiB |
| test_0015.txt | AC | 2 ms | 3552 KiB |
| test_0016.txt | AC | 2 ms | 3708 KiB |
| test_0017.txt | AC | 2 ms | 3708 KiB |
| test_0018.txt | AC | 2 ms | 3612 KiB |
| test_0019.txt | AC | 2 ms | 3540 KiB |
| test_0020.txt | AC | 2 ms | 3700 KiB |
| test_0021.txt | AC | 2 ms | 3648 KiB |
| test_0022.txt | AC | 2 ms | 3648 KiB |
| test_0023.txt | AC | 2 ms | 3640 KiB |
| test_0024.txt | AC | 2 ms | 3708 KiB |
| test_0025.txt | AC | 2 ms | 3700 KiB |
| test_0026.txt | AC | 2 ms | 3712 KiB |
| test_0027.txt | AC | 2 ms | 3708 KiB |
| test_0028.txt | AC | 2 ms | 3592 KiB |
| test_0029.txt | AC | 2 ms | 3712 KiB |
| test_0030.txt | AC | 2 ms | 3704 KiB |
| test_0031.txt | AC | 2 ms | 3540 KiB |
| test_0032.txt | AC | 2 ms | 3644 KiB |
| test_0033.txt | AC | 2 ms | 3700 KiB |
| test_0034.txt | AC | 2 ms | 3592 KiB |
| test_0035.txt | AC | 3 ms | 3552 KiB |
| test_0036.txt | AC | 2 ms | 3592 KiB |
| test_0037.txt | AC | 2 ms | 3552 KiB |
| test_0038.txt | AC | 2 ms | 3552 KiB |
| test_0039.txt | AC | 2 ms | 3652 KiB |
| test_0040.txt | AC | 2 ms | 3640 KiB |
| test_0041.txt | AC | 2 ms | 3664 KiB |
| test_0042.txt | AC | 2 ms | 3712 KiB |
| test_0043.txt | AC | 2 ms | 3544 KiB |
| test_0044.txt | AC | 2 ms | 3700 KiB |
| test_0045.txt | AC | 2 ms | 3700 KiB |
| test_0046.txt | AC | 2 ms | 3700 KiB |
| test_0047.txt | AC | 2 ms | 3608 KiB |
| test_0048.txt | AC | 2 ms | 3632 KiB |
| test_0049.txt | AC | 2 ms | 3632 KiB |
| test_0050.txt | AC | 2 ms | 3712 KiB |
| test_0051.txt | AC | 2 ms | 3708 KiB |
| test_0052.txt | AC | 2 ms | 3700 KiB |
| test_0053.txt | AC | 2 ms | 3712 KiB |
| test_0054.txt | AC | 2 ms | 3708 KiB |
| test_0055.txt | AC | 2 ms | 3608 KiB |
| test_0056.txt | AC | 2 ms | 3632 KiB |
| test_0057.txt | AC | 2 ms | 3544 KiB |
| test_0058.txt | AC | 2 ms | 3648 KiB |
| test_0059.txt | AC | 2 ms | 3644 KiB |
| test_0060.txt | AC | 2 ms | 3544 KiB |
| test_0061.txt | AC | 2 ms | 3592 KiB |
| test_0062.txt | AC | 2 ms | 3700 KiB |
| test_0063.txt | AC | 2 ms | 3672 KiB |
| test_0064.txt | AC | 2 ms | 3640 KiB |
| test_0065.txt | AC | 2 ms | 3552 KiB |
| test_0066.txt | AC | 3 ms | 3700 KiB |
| test_0067.txt | AC | 2 ms | 3640 KiB |
| test_0068.txt | AC | 3 ms | 3640 KiB |
| test_0069.txt | AC | 3 ms | 3708 KiB |
| test_0070.txt | AC | 3 ms | 3632 KiB |
| test_0071.txt | AC | 2 ms | 3712 KiB |
| test_0072.txt | AC | 2 ms | 3648 KiB |
| test_0073.txt | AC | 2 ms | 3632 KiB |
| test_0074.txt | AC | 2 ms | 3708 KiB |
| test_0075.txt | AC | 2 ms | 3644 KiB |
| test_0076.txt | AC | 2 ms | 3700 KiB |
| test_0077.txt | AC | 2 ms | 3664 KiB |
| test_0078.txt | AC | 2 ms | 3632 KiB |
| test_0079.txt | AC | 2 ms | 3712 KiB |
| test_0080.txt | AC | 2 ms | 3712 KiB |
| test_0081.txt | AC | 2 ms | 3680 KiB |
| test_0082.txt | AC | 2 ms | 3540 KiB |
| test_0083.txt | AC | 2 ms | 3608 KiB |
| test_0084.txt | AC | 2 ms | 3640 KiB |
| test_0085.txt | AC | 2 ms | 3552 KiB |
| test_0086.txt | AC | 2 ms | 3632 KiB |
| test_0087.txt | AC | 2 ms | 3592 KiB |
| test_0088.txt | AC | 2 ms | 3696 KiB |
| test_0089.txt | AC | 2 ms | 3700 KiB |
| test_0090.txt | AC | 2 ms | 3544 KiB |
| test_0091.txt | AC | 2 ms | 3592 KiB |
| test_0092.txt | AC | 2 ms | 3608 KiB |
| test_0093.txt | AC | 2 ms | 3592 KiB |
| test_0094.txt | AC | 3 ms | 3552 KiB |
| test_0095.txt | AC | 3 ms | 3608 KiB |
| test_0096.txt | AC | 3 ms | 3632 KiB |
| test_0097.txt | AC | 3 ms | 3700 KiB |
| test_0098.txt | AC | 2 ms | 3700 KiB |
| test_0099.txt | AC | 2 ms | 3612 KiB |
| test_0100.txt | AC | 2 ms | 3592 KiB |
| test_0101.txt | AC | 2 ms | 3612 KiB |
| test_0102.txt | AC | 2 ms | 3632 KiB |
| test_0103.txt | AC | 2 ms | 3612 KiB |
| test_0104.txt | AC | 2 ms | 3540 KiB |
| test_0105.txt | AC | 2 ms | 3648 KiB |
| test_0106.txt | AC | 2 ms | 3592 KiB |
| test_0107.txt | AC | 2 ms | 3632 KiB |
| test_0108.txt | AC | 2 ms | 3544 KiB |
| test_0109.txt | AC | 2 ms | 3544 KiB |
| test_0110.txt | AC | 2 ms | 3700 KiB |
| test_0111.txt | AC | 2 ms | 3644 KiB |
| test_0112.txt | AC | 2 ms | 3708 KiB |
| test_0113.txt | AC | 2 ms | 3644 KiB |
| test_0114.txt | AC | 2 ms | 3712 KiB |
| test_0115.txt | AC | 2 ms | 3644 KiB |
| test_0116.txt | AC | 2 ms | 3640 KiB |
| test_0117.txt | AC | 2 ms | 3648 KiB |
| test_0118.txt | AC | 2 ms | 3552 KiB |
| test_0119.txt | AC | 2 ms | 3644 KiB |
| test_0120.txt | AC | 2 ms | 3712 KiB |
| test_0121.txt | AC | 2 ms | 3540 KiB |
| test_0122.txt | AC | 2 ms | 3592 KiB |
| test_0123.txt | AC | 2 ms | 3712 KiB |
| test_0124.txt | AC | 3 ms | 3596 KiB |
| test_0125.txt | AC | 2 ms | 3664 KiB |
| test_0126.txt | AC | 2 ms | 3540 KiB |
| test_0127.txt | AC | 2 ms | 3540 KiB |
| test_0128.txt | AC | 2 ms | 3544 KiB |
| test_0129.txt | AC | 2 ms | 3644 KiB |
| test_0130.txt | AC | 2 ms | 3664 KiB |
| test_0131.txt | AC | 2 ms | 3648 KiB |
| test_0132.txt | AC | 2 ms | 3664 KiB |
| test_0133.txt | AC | 3 ms | 3540 KiB |
| test_0134.txt | AC | 2 ms | 3708 KiB |
| test_0135.txt | AC | 2 ms | 3708 KiB |
| test_0136.txt | AC | 2 ms | 3612 KiB |
| test_0137.txt | AC | 2 ms | 3592 KiB |
| test_0138.txt | AC | 2 ms | 3664 KiB |
| test_0139.txt | AC | 2 ms | 3592 KiB |
| test_0140.txt | AC | 2 ms | 3712 KiB |
| test_0141.txt | AC | 2 ms | 3708 KiB |
| test_0142.txt | AC | 2 ms | 3664 KiB |
| test_0143.txt | AC | 2 ms | 3700 KiB |
| test_0144.txt | AC | 2 ms | 3700 KiB |
| test_0145.txt | AC | 2 ms | 3552 KiB |
| test_0146.txt | AC | 2 ms | 3700 KiB |
| test_0147.txt | AC | 2 ms | 3644 KiB |
| test_0148.txt | AC | 2 ms | 3632 KiB |
| test_0149.txt | AC | 2 ms | 3664 KiB |