提出 #65212525
ソースコード 拡げる
#include <bits/stdc++.h>
using namespace std;
/* ---- 型エイリアス ---- */
using ull = unsigned long long; using ll = long long;
using vi = vector<int>; using vl = vector<long long>;
using pii = pair<int,int>; using pll = pair<ll,ll>;
/* ---- 定数 ---- */
constexpr int N = 20, M_FIXED = 40;
int MAX_TURN = 2*N*M_FIXED;
int BEAM_WIDTH = 6000;
constexpr double ALPHA = 0.2, BETA = 50.0, GAMMA = 0.8;
const int DX[4]={-1,1,0,0}, DY[4]={0,0,-1,1};
const char DC[4]={'U','D','L','R'};
inline bool inside(int x,int y){ return 0<=x && x<N && 0<=y && y<N; }
/* ---- 壁を 1 行 = 20bit の uint32_t に圧縮 ---- */
using Wall = array<uint32_t,N>; // bit==1 ならブロック
inline bool is_wall(const Wall& w,int x,int y){ return (w[x]>>y)&1u; }
inline void toggle_wall(Wall& w,int x,int y){ w[x] ^= (1u<<y); }
/* ---------- 状態 ---------- */
struct State{
Wall wall;
int x,y; // 現在位置
int goal; // 次ゴール index
double score;
vector<char> act; // 行動列
};
/* ---------- 1 手展開 ---------- */
inline int manh(int x,int y,int gx,int gy){
return abs(x-gx) + abs(y-gy);
}
/* ---------- 1 手展開(マンハッタン評価版) ---------- */
void expand(const State& st,const vector<pii>& goals,
vector<State>& buf)
{
const int gx = st.x, gy = st.y;
const pii gnow = goals[st.goal];
// --- ① 向きの決定(ゴールへの主方向) ---
int dxG = gnow.first - gx;
int dyG = gnow.second - gy;
int forwardDir;
if(abs(dxG) > abs(dyG)){
forwardDir = (dxG > 0 ? 1 /*D*/ : 0 /*U*/);
} else {
forwardDir = (dyG > 0 ? 3 /*R*/ : 2 /*L*/);
}
const int d_here = manh(gx, gy, gnow.first, gnow.second);
/* ---- Move / Slide ---- */
for(int dir=0; dir<4; ++dir){
/* ---------- Move ---------- */
int mx = gx + DX[dir], my = gy + DY[dir];
if(inside(mx,my) && !is_wall(st.wall,mx,my)){
State nx = st; nx.x = mx; nx.y = my;
int d_next = manh(mx,my, gnow.first, gnow.second);
bool reach = (d_next == 0);
double sc = (d_here - d_next) + (reach ? BETA : 0);
nx.score += sc;
if(reach) ++nx.goal;
nx.act.push_back('M'); nx.act.push_back(DC[dir]);
buf.emplace_back(move(nx));
}
/* ---------- Slide ---------- */
int sx=gx, sy=gy;
while(true){
int tx=sx+DX[dir], ty=sy+DY[dir];
if(!inside(tx,ty) || is_wall(st.wall,tx,ty)) break;
sx=tx; sy=ty;
}
if(sx!=gx || sy!=gy){
State nx = st; nx.x = sx; nx.y = sy;
int d_next = manh(sx,sy, gnow.first, gnow.second);
bool reach = (d_next == 0);
double sc = (d_here - d_next) + (reach ? BETA : 0);
nx.score += sc;
if(reach) ++nx.goal;
nx.act.push_back('S'); nx.act.push_back(DC[dir]);
buf.emplace_back(move(nx));
}
}
/* ---- Toggle(新しい周辺/行列ペナルティ付き評価) ---- */
constexpr int R_CHECK = 3; // 周辺チェック距離
constexpr double BONUS_NO_NEAR = 5.0; // 周辺にブロック無しで加点
constexpr double PENALTY_NEAR = 3.0; // 周辺にブロックありで減点
constexpr double PENALTY_ROWCOL = 2.0; // 同行/同列にブロックありで減点
for(int dir=0; dir<4; ++dir){
int cx = gx + DX[dir], cy = gy + DY[dir];
if(!inside(cx,cy)) continue;
bool wasWall = is_wall(st.wall, cx, cy);
// ─── 未来のゴールへの設置を禁止 ───
if(!wasWall){
bool isFutureTarget = false;
for(int k = st.goal; k < (int)goals.size(); ++k){
if(goals[k].first == cx && goals[k].second == cy){
isFutureTarget = true;
break;
}
}
if(isFutureTarget) continue; // 置く操作をスキップ
}
State nx = st;
toggle_wall(nx.wall, cx, cy);
// 1ターン消費分のコスト
double sc = -1.0;
// ① 周辺チェック...
bool anyNear = false;
for(int dx=-R_CHECK; dx<=R_CHECK && !anyNear; ++dx){
for(int dy=-(R_CHECK-abs(dx)); dy<=(R_CHECK-abs(dx)); ++dy){
int x2 = cx + dx, y2 = cy + dy;
if(!inside(x2,y2)) continue;
if(is_wall(st.wall, x2, y2)){
anyNear = true;
break;
}
}
}
if(!anyNear) sc += BONUS_NO_NEAR;
else sc -= PENALTY_NEAR;
// ② 行列チェック...
bool blockRowCol = false;
for(int y2=0; y2<N; ++y2){
if(y2!=cy && is_wall(st.wall, cx, y2)){
blockRowCol = true; break;
}
}
if(!blockRowCol){
for(int x2=0; x2<N; ++x2){
if(x2!=cx && is_wall(st.wall, x2, cy)){
blockRowCol = true; break;
}
}
}
if(blockRowCol) sc -= PENALTY_ROWCOL;
// 枝刈り
if(sc < -0.5) continue;
// スコア反映&アクション登録
nx.score += sc;
nx.act.push_back('A');
nx.act.push_back(DC[dir]);
buf.emplace_back(move(nx));
}
}
/* ========================================================= */
int main(int argc,char* argv[]){
bool debug = true;
ios::sync_with_stdio(false);
cin.tie(nullptr);
/* ---- 入力 ---- */
int n, M; // n = 20, M = 40
cin >> n >> M;
if(argc >= 2) BEAM_WIDTH = max(1, stoi(argv[1]));
int sx, sy; // 初期位置
cin >> sx >> sy;
vector<pii> goals(M-1);
for(auto& g : goals) cin >> g.first >> g.second;
/* ---- 初期状態 ---- */
State init;
init.wall.fill(0u);
init.x = sx; init.y = sy;
init.goal = 0;
init.score = 0.0;
/* ------------- 省略: すべての前半部分は元コードと同じ ------------- */
vector<State> beam{init}, nxt;
beam.reserve(BEAM_WIDTH);
nxt.reserve(BEAM_WIDTH * 12); // 1 手で最大 12 分岐
for(int turn = 0; turn < MAX_TURN && !beam.empty(); ++turn){
/* --- 動的ビーム幅調整をここで実行 --- */
if(turn == 400) BEAM_WIDTH = max(1, BEAM_WIDTH / 2);
if(turn == 1000) BEAM_WIDTH = max(1, BEAM_WIDTH / 4);
nxt.clear();
for(const State& st : beam){
if(st.goal == M-1){ // すでに全ゴール達成
nxt.push_back(st);
continue;
}
/* ---- 1 手展開(マンハッタン評価版) ---- */
expand(st, goals, nxt);
}
/* ---- ビーム選択 ---- */
int keep = min(BEAM_WIDTH, (int)nxt.size());
partial_sort(nxt.begin(), nxt.begin() + keep, nxt.end(),
[](const State& a, const State& b){ return a.score > b.score; });
nxt.resize(keep);
beam.swap(nxt);
if(beam[0].goal == M-1) break; // 早期終了
}
/* ---- 出力 ---- */
const State& best = beam[0];
for(size_t i = 0; i + 1 < best.act.size(); i += 2){
cout << best.act[i] << ' ' << best.act[i + 1] << '\n';
}
return 0;
}
提出情報
| 提出日時 | |
|---|---|
| 問題 | A - Skating with Blocks |
| ユーザ | koshinM |
| 言語 | C++ 17 (gcc 12.2) |
| 得点 | 214118 |
| コード長 | 7505 Byte |
| 結果 | AC |
| 実行時間 | 1859 ms |
| メモリ | 81372 KiB |
コンパイルエラー
Main.cpp: In function ‘void expand(const State&, const std::vector<std::pair<int, int> >&, std::vector<State>&)’:
Main.cpp:50:9: warning: variable ‘forwardDir’ set but not used [-Wunused-but-set-variable]
50 | int forwardDir;
| ^~~~~~~~~~
Main.cpp: In function ‘int main(int, char**)’:
Main.cpp:173:10: warning: unused variable ‘debug’ [-Wunused-variable]
173 | bool debug = true;
| ^~~~~
ジャッジ結果
| セット名 | test_ALL | ||
|---|---|---|---|
| 得点 / 配点 | 214118 / 246000 | ||
| 結果 |
|
| セット名 | テストケース |
|---|---|
| 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 |
| ケース名 | 結果 | 実行時間 | メモリ |
|---|---|---|---|
| test_0000.txt | AC | 1720 ms | 66576 KiB |
| test_0001.txt | AC | 1509 ms | 67488 KiB |
| test_0002.txt | AC | 1410 ms | 61676 KiB |
| test_0003.txt | AC | 1506 ms | 65832 KiB |
| test_0004.txt | AC | 1638 ms | 62688 KiB |
| test_0005.txt | AC | 1360 ms | 62524 KiB |
| test_0006.txt | AC | 1732 ms | 65400 KiB |
| test_0007.txt | AC | 1756 ms | 72772 KiB |
| test_0008.txt | AC | 1713 ms | 67496 KiB |
| test_0009.txt | AC | 1510 ms | 63868 KiB |
| test_0010.txt | AC | 1574 ms | 65992 KiB |
| test_0011.txt | AC | 1665 ms | 70888 KiB |
| test_0012.txt | AC | 1612 ms | 67460 KiB |
| test_0013.txt | AC | 1628 ms | 64848 KiB |
| test_0014.txt | AC | 1531 ms | 70044 KiB |
| test_0015.txt | AC | 1674 ms | 71888 KiB |
| test_0016.txt | AC | 1428 ms | 61940 KiB |
| test_0017.txt | AC | 1514 ms | 62644 KiB |
| test_0018.txt | AC | 1601 ms | 69248 KiB |
| test_0019.txt | AC | 1721 ms | 73236 KiB |
| test_0020.txt | AC | 1536 ms | 63424 KiB |
| test_0021.txt | AC | 1473 ms | 58236 KiB |
| test_0022.txt | AC | 1839 ms | 66024 KiB |
| test_0023.txt | AC | 1690 ms | 68608 KiB |
| test_0024.txt | AC | 1261 ms | 61488 KiB |
| test_0025.txt | AC | 1669 ms | 72156 KiB |
| test_0026.txt | AC | 1525 ms | 61268 KiB |
| test_0027.txt | AC | 1762 ms | 66876 KiB |
| test_0028.txt | AC | 1437 ms | 66856 KiB |
| test_0029.txt | AC | 1628 ms | 64408 KiB |
| test_0030.txt | AC | 1213 ms | 55436 KiB |
| test_0031.txt | AC | 1408 ms | 59536 KiB |
| test_0032.txt | AC | 1497 ms | 64072 KiB |
| test_0033.txt | AC | 1391 ms | 60712 KiB |
| test_0034.txt | AC | 1471 ms | 64904 KiB |
| test_0035.txt | AC | 1431 ms | 63920 KiB |
| test_0036.txt | AC | 1410 ms | 61332 KiB |
| test_0037.txt | AC | 1423 ms | 61200 KiB |
| test_0038.txt | AC | 1732 ms | 67548 KiB |
| test_0039.txt | AC | 1756 ms | 68936 KiB |
| test_0040.txt | AC | 1488 ms | 64320 KiB |
| test_0041.txt | AC | 1427 ms | 61756 KiB |
| test_0042.txt | AC | 1557 ms | 60172 KiB |
| test_0043.txt | AC | 1434 ms | 62932 KiB |
| test_0044.txt | AC | 1482 ms | 63688 KiB |
| test_0045.txt | AC | 1462 ms | 64508 KiB |
| test_0046.txt | AC | 1544 ms | 62824 KiB |
| test_0047.txt | AC | 1521 ms | 64920 KiB |
| test_0048.txt | AC | 1697 ms | 68964 KiB |
| test_0049.txt | AC | 1374 ms | 59164 KiB |
| test_0050.txt | AC | 1406 ms | 57464 KiB |
| test_0051.txt | AC | 1582 ms | 65696 KiB |
| test_0052.txt | AC | 1764 ms | 66540 KiB |
| test_0053.txt | AC | 1384 ms | 54912 KiB |
| test_0054.txt | AC | 1513 ms | 68260 KiB |
| test_0055.txt | AC | 1427 ms | 65612 KiB |
| test_0056.txt | AC | 1500 ms | 63732 KiB |
| test_0057.txt | AC | 1577 ms | 64732 KiB |
| test_0058.txt | AC | 1744 ms | 67736 KiB |
| test_0059.txt | AC | 1704 ms | 68108 KiB |
| test_0060.txt | AC | 1524 ms | 63900 KiB |
| test_0061.txt | AC | 1448 ms | 67144 KiB |
| test_0062.txt | AC | 1538 ms | 63456 KiB |
| test_0063.txt | AC | 1555 ms | 61080 KiB |
| test_0064.txt | AC | 1667 ms | 69728 KiB |
| test_0065.txt | AC | 1432 ms | 61892 KiB |
| test_0066.txt | AC | 1601 ms | 67624 KiB |
| test_0067.txt | AC | 1615 ms | 65352 KiB |
| test_0068.txt | AC | 1377 ms | 61976 KiB |
| test_0069.txt | AC | 1507 ms | 63844 KiB |
| test_0070.txt | AC | 1570 ms | 67288 KiB |
| test_0071.txt | AC | 1601 ms | 67828 KiB |
| test_0072.txt | AC | 1412 ms | 70764 KiB |
| test_0073.txt | AC | 1419 ms | 59092 KiB |
| test_0074.txt | AC | 1520 ms | 59160 KiB |
| test_0075.txt | AC | 1645 ms | 64220 KiB |
| test_0076.txt | AC | 1440 ms | 64520 KiB |
| test_0077.txt | AC | 1636 ms | 67356 KiB |
| test_0078.txt | AC | 1499 ms | 61904 KiB |
| test_0079.txt | AC | 1517 ms | 65272 KiB |
| test_0080.txt | AC | 1506 ms | 60852 KiB |
| test_0081.txt | AC | 1337 ms | 57704 KiB |
| test_0082.txt | AC | 1495 ms | 60940 KiB |
| test_0083.txt | AC | 1601 ms | 65560 KiB |
| test_0084.txt | AC | 1400 ms | 64392 KiB |
| test_0085.txt | AC | 1621 ms | 70880 KiB |
| test_0086.txt | AC | 1381 ms | 62460 KiB |
| test_0087.txt | AC | 1567 ms | 68284 KiB |
| test_0088.txt | AC | 1451 ms | 58316 KiB |
| test_0089.txt | AC | 1458 ms | 61320 KiB |
| test_0090.txt | AC | 1704 ms | 67884 KiB |
| test_0091.txt | AC | 1526 ms | 60312 KiB |
| test_0092.txt | AC | 1677 ms | 68968 KiB |
| test_0093.txt | AC | 1859 ms | 81372 KiB |
| test_0094.txt | AC | 1380 ms | 58168 KiB |
| test_0095.txt | AC | 1479 ms | 60052 KiB |
| test_0096.txt | AC | 1573 ms | 65428 KiB |
| test_0097.txt | AC | 1402 ms | 58820 KiB |
| test_0098.txt | AC | 1647 ms | 67944 KiB |
| test_0099.txt | AC | 1599 ms | 67560 KiB |
| test_0100.txt | AC | 1408 ms | 62912 KiB |
| test_0101.txt | AC | 1355 ms | 57544 KiB |
| test_0102.txt | AC | 1641 ms | 72864 KiB |
| test_0103.txt | AC | 1390 ms | 56904 KiB |
| test_0104.txt | AC | 1639 ms | 65396 KiB |
| test_0105.txt | AC | 1562 ms | 67108 KiB |
| test_0106.txt | AC | 1502 ms | 59748 KiB |
| test_0107.txt | AC | 1316 ms | 57492 KiB |
| test_0108.txt | AC | 1578 ms | 62064 KiB |
| test_0109.txt | AC | 1616 ms | 61648 KiB |
| test_0110.txt | AC | 1421 ms | 58784 KiB |
| test_0111.txt | AC | 1565 ms | 64832 KiB |
| test_0112.txt | AC | 1481 ms | 58076 KiB |
| test_0113.txt | AC | 1695 ms | 69100 KiB |
| test_0114.txt | AC | 1552 ms | 65136 KiB |
| test_0115.txt | AC | 1516 ms | 61612 KiB |
| test_0116.txt | AC | 1794 ms | 72104 KiB |
| test_0117.txt | AC | 1433 ms | 62180 KiB |
| test_0118.txt | AC | 1552 ms | 65344 KiB |
| test_0119.txt | AC | 1523 ms | 66052 KiB |
| test_0120.txt | AC | 1390 ms | 64408 KiB |
| test_0121.txt | AC | 1587 ms | 66720 KiB |
| test_0122.txt | AC | 1379 ms | 61836 KiB |
| test_0123.txt | AC | 1744 ms | 67764 KiB |
| test_0124.txt | AC | 1421 ms | 59656 KiB |
| test_0125.txt | AC | 1578 ms | 59760 KiB |
| test_0126.txt | AC | 1526 ms | 64572 KiB |
| test_0127.txt | AC | 1601 ms | 63620 KiB |
| test_0128.txt | AC | 1686 ms | 65356 KiB |
| test_0129.txt | AC | 1262 ms | 58072 KiB |
| test_0130.txt | AC | 1823 ms | 70444 KiB |
| test_0131.txt | AC | 1453 ms | 65128 KiB |
| test_0132.txt | AC | 1605 ms | 63792 KiB |
| test_0133.txt | AC | 1569 ms | 66796 KiB |
| test_0134.txt | AC | 1428 ms | 65412 KiB |
| test_0135.txt | AC | 1421 ms | 62660 KiB |
| test_0136.txt | AC | 1521 ms | 67144 KiB |
| test_0137.txt | AC | 1486 ms | 58504 KiB |
| test_0138.txt | AC | 1347 ms | 53688 KiB |
| test_0139.txt | AC | 1592 ms | 72692 KiB |
| test_0140.txt | AC | 1568 ms | 61856 KiB |
| test_0141.txt | AC | 1536 ms | 64360 KiB |
| test_0142.txt | AC | 1552 ms | 70428 KiB |
| test_0143.txt | AC | 1479 ms | 62360 KiB |
| test_0144.txt | AC | 1628 ms | 67188 KiB |
| test_0145.txt | AC | 1429 ms | 60160 KiB |
| test_0146.txt | AC | 1435 ms | 60552 KiB |
| test_0147.txt | AC | 1470 ms | 62532 KiB |
| test_0148.txt | AC | 1763 ms | 60856 KiB |
| test_0149.txt | AC | 1342 ms | 60848 KiB |