洛谷P5380 鴨棋

2022-09-23 02:02:07 字數 4041 閱讀 4605

鴨棋是一種風靡鴨子界的棋類遊戲。事實上,它與中國象棋有一些相似之處,但規則不盡相同。在這裡,我們將為你介紹鴨棋的規則。

同時,我們下發了一個模擬鴨棋規則的玩具,你可以結合這個玩具理解題目(也可以在 ak 後與你的隊友進行對弈)。詳情請見「玩具使用說明」。

鴨棋在一個 \(10\times 9\)(\(10\) 行 \(9\) 列)的網格棋盤上進行,網格上的每個格點都可以有棋子停留。對弈雙方一方執紅(red)棋、另一方執藍(blue)棋,雙方輪流執行操作,輪到一位玩家操作時,他必須選擇一枚自己的棋子,並按照規則進行一步移動。

鴨棋發明者鴨子德規定一局鴨棋由紅方執先手,並設計了初始棋盤佈局如下:

棋子分為 \(7\) 類,下面介紹了它們的名字以及它們的移動規則。介紹移動規則時,我們預設棋子所處位置為 \(\left( x,y\right)\)(表示第 \(x\) 行的第 \(y\) 列,下同),並列出它可以到達的位置:

horse):可達的位置至多 \(8\) 個,對於任意 \(s_x,s_y\in \left\\),分別有:

car):可在不跨越其他棋子的前提下,到達同行或同列的所有其他位置。

duck):可達的位置至多 \(8\) 個,對於任意 \(s_x,s_y\in \left\\),分別有:

soldier):可達的位置共 \(8\) 個,包括 \(\left(x\pm 1,y\right)\) 及 \(\left(x,y\pm 1\right)\) 及 \(\left(x\pm 1,y\pm 1\right)\) 及 \(\left(x\pm 1,y\mp 1\right)\)。

除上面描述的規則之外,棋子移動還有如下額外規則:

玩家在這個遊戲中的目標是將對方的移出遊戲。一旦一方的被移出遊戲,則另一方立即宣告勝利。

對於一個棋盤的狀態,如果存在一方有一步合法的操作能夠將另一方的移出遊戲,則我們說當前局面是一個將軍的局面。需要友情提示的是,根據定義,將軍局面的形成包括(但不限於)如下這些可能:

一方將一枚棋子移動到可以攻擊對方的位置

在己方受到威脅時不採取措施躲避

主動將移動至會受到攻擊的位置

除此之外,需要特別說明的是,遊戲結束後,由於雙方不可再操作,因此不可能出現將軍局面,即便此時另一方王處於被「攻擊」的位置。

今年的 idcc(international duck chess competition,國際鴨棋大賽)正在如火如荼地進行著。你觀摩了一場精彩絕倫的比賽,但你對對弈過程的記憶已經模糊不清了,只有系統留下的他們的操作序列,序列中的每個操作為當前操作者試圖移動某個位置的棋子至另一個位置。你希望用這個序列,來複現出整局棋局的對弈過程。即,對於每步操作,你需要首先判其是否合法,若合法,則進一步求出

這步操作移動了哪個棋子。

這步操作後,是否存在棋子被移出遊戲,如有則還需求出被移出遊戲的棋子。

這步操作後,是否形成將軍局面。

這步操作後,遊戲是否結束。

可能包含的不合法情況如下:

序列中的不合法操作是需要被忽略的。比如,如果輪到紅方移動,此時序列中的當前操作恰好是不合法的,則這個操作將被忽略,序列中的下一步操作將成為紅方這步的操作(如仍不合法則繼續忽略,直至出現合法的操作)。

第一行一個非負整數 \(q\),表示操作序列的長度。接下來依次描述每個操作。

接下來 \(q\) 行,每行 \(4\) 個整數 \(x_s, y_s, x_t, y_t\)(\(0\leq x_s,x_t < 10\),\(0\leq y_s,y_t < 9\)),描述一個欲將 \(\left(x_s,y_s\right)\) 處棋子移動到 \(\left(x_t,y_t\right)\) 的操作。在這裡,我們規定左下角(即紅方擺放的位置,圖見「題目背景」)為 \(\left(0,0\right)\)。

保證 \(q\leq 1000\)。

輸出 \(q\) 行,對於每個操作依次輸出復現結果。每行輸出一個操作的結果:

複製貼上題目真 nm 麻煩

本來想敲一道比較噁心的模擬練練手的,但是敲完後發現這道題題目是很長,但是其實不難。

主要分成 4 個部分來做:

判斷該點是否有棋子

判斷該棋子能否走到目標位置(行走方式、是否有障礙)

判斷目標位置是否有敵方棋子

判斷目標位置是否造成將軍

首先設 \(col[x][y]\) 表示 \((x,y)\) 的棋子的顏色,\(type[x][y]\) 表示 \((x,y)\) 的棋子的種類。\((sx,sy)(tx,ty)\) 分別是起點和終點。

判斷是否有棋子很簡單,直接判斷 \(col[sx][sy]\) 是否是現在移動的那一方即可。

如果是,那麼就暴力判斷能否到達目標點。注意象、馬、車、鴨移動是需要判斷障礙的。

如果可以移動,那麼就輸出第一問和第二問。否則該步驟無效。

接下來判斷是否將軍或者結束。我們找到雙方的王,然後依次列舉每一個位置 \((i,j)\),判斷 \(col[i][j]\) 是否與現在列舉到的王不一樣。如果是,那麼判斷 \((i,j)\) 能否走到王的位置即可。如果可以,輸出yes;no;否則輸出no;no

注意在找王的時候如果沒找到,那麼說明已經結束了。直接退出迴圈,輸出no;yes,並且剩下的詢問全部輸出invalid command即可。

思維難度和**難度都不大。

老年人手速都 \(80min\) 內搞定這題,忘記關掉檔案輸入不算的話一次就過了。

#include #include #include #define fail 

using namespace std;

const int n=15;

int q,now,col[n][n],type[n][n];

void prework()

// 1 2 3 4 5 6 7

// 王 士 象 馬 車 鴨 兵

bool move(int sx,int sy,int tx,int ty)

if (type[sx][sy]==2)

if (type[sx][sy]==3)

if (type[sx][sy]==4)

if (type[sx][sy]==5)

if (sy==ty)

return 0;

} if (type[sx][sy]==6)

if (type[sx][sy]==7)

return 0;

}void print_type(int sx,int sy)

void find_captain(int k,int &x,int &y)

}int main()

for (int i=1;i<=10;i++)

for (int j=1;j<=9;j++)

if (col[i][j]==3-k && move(i,j,x,y)) flag=1;

} if (flag) printf("yes;no\n");

else printf("no;no\n");

now=3-now;

} finish:

for (int i=1;i<=q;i++) fail;

return 0;

}

洛谷p3956 棋盤

日常blog 棋盤 題目連結 演算法 然後這是2017普及組 first 關於顏色處理 讓c i j color 1 這樣無色 0,紅色 1...

洛谷 p1541烏龜棋

洛谷 p1541烏龜棋 小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。 烏龜棋的棋盤是一行nn個格子,每個格子上一個分數 非負整數 。棋盤...

洛谷P1541 烏龜棋

小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。 烏龜棋的棋盤是一行n個格子,每個格子上一個分數 非負整數 。棋盤第1格是唯一的起點,第n格...