提出 #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
結果
AC × 150
セット名 テストケース
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