首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Codeforces 538D Weird Chess:棋子移動向量重構

     編輯:關於C++

題目描述

n×n 棋盤,給定棋子位置('o')、被攻擊位置('x')、安全位置('.')。所有棋子移動向量相同。求一組合法移動向量集合,或判定無解。輸出 (2n-1)×(2n-1) 圖示(中心為棋子,'x' 為可攻擊)。

解題思路:最大化候選向量再驗證

  1. 收集所有棋子位置 pieces。
  2. 候選向量:所有 (dx,dy) 使得對每個棋子 (x,y),若 (x+dx, y+dy) 在盤內,則該位置必須是 'x'(不能是 '.')。即:向量不能導致攻擊到安全格。
  3. 構建最大合法向量集 S。
  4. 驗證:用 S 模擬所有棋子攻擊,生成攻擊圖,與輸入 'x'/'o' 比較(忽略 'o' 位置是否被攻擊)。完全匹配則有解,輸出 S 的圖示;否則 NO。

C++ 代碼框架

int n; vector board;
vector> pieces;
bool valid[100][100] = {}; // 向量偏移 +n 偏移

int main() {
    cin >> n;
    board.resize(n);
    for (int i=0;i> board[i];
        for (int j=0;j sim(n, string(n, '.'));
    for (auto [x,y] : pieces) {
        for (int dx = -(n-1); dx <= n-1; ++dx)
            for (int dy = -(n-1); dy <= n-1; ++dy)
                if (valid[dx+n][dy+n]) {
                    int nx=x+dx, ny=y+dy;
                    if (0<=nx&&nx

關鍵點

  • 向量空間大小 (2n-1)²,n≤50 時僅 9801,暴力枚舉極快。
  • 驗證時 'o' 位置允許被攻擊也允許不被攻擊(題目說 "may or may not be attacked")。
  • 輸出格式:中心 'o',合法向量 'x',其餘 '.'。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved