1457 棋盤遊戲

2021-07-30 01:24:53 字數 1428 閱讀 8455

time limit: 5 sec  

memory limit: 64 mb

submit: 327  

solved: 185 [

submit][

status][

discuss]

有乙個100 * 100的棋盤,其中左下角的編號為(0, 0), 右上角編號為(99, 99)。棋盤上有n個queen,最開始第i個queen的位置為(xi, yi)。現在有兩個玩家依次來操作,每一次乙個玩家可以選擇其中乙個queen,將它跳到(xi – k, yi)或(xi, yi - k)或(xi – k, yi - k), 其中k > 0。注意在遊戲的過程中,乙個格仔裡面可能出現多個queen。如果誰先將任意乙個queen移動到(0, 0), 誰就獲勝。問先手必勝還是後手必勝?

注意本題是多組資料。 第一行有乙個數t, 表示資料組數。 接下來有t組資料,每組資料的第一行乙個正整數n表示queen的個數。接下來n行每行兩個數表示第i個queen的初始位置xi, yi(0 <= xi <= 99, 0 <= yi <= 99)。

對於每一組資料,你需要輸出是先手必勝還是後手必勝。 如果是先手必勝,輸出「^o^「, 如果是後手必勝,輸出」t_t」。22

3 43 5

33 2

4 23 1

^o^t_t

資料範圍

t <= 10, n <= 1000 [

submit][

status][

discuss]

考慮到是任意乙個皇后到達(0,0)時遊戲宣告結束,就不能將(0,0)設定為遊戲的終止狀態。

對於主對角線和(0,k)(k,0)這三類點,雙方肯定都是避免將棋子移到上面,因為這個時候後手一步取勝

那麼就將終止狀態設為(1,2)和(2,1)兩個點,因為這兩個點先手無論怎麼移動,都是後手必勝

剩下的就是暴力搜一搜,用sg定理判斷答案了,注意轉移過程不能觸碰到上述三類點

注意特判初始狀態有皇后在以上三類點的情況。

#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

const int n = 100;

int t,n,cnt,sg[n][n],bo[n*n];

bool vis[n][n];

void dfs(int x,int y)}

void check()

puts(flag || sum ? "^o^" : "t_t");}

int main()

bzoj1457 棋盤遊戲

有乙個100 100的棋盤,其中左下角的編號為 0,0 右上角編號為 99,99 棋盤上有n個queen,最開始第i個queen的位置為 xi,yi 現在有兩個玩家依次來操作,每一次乙個玩家可以選擇其中乙個queen,將它跳到 xi k,yi 或 xi,yi k 或 xi k,yi k 其中k 0。...

bzoj1457 棋盤遊戲

題目描述 100 100 的棋盤上有 n 個 queen 每個 queen 可以向左,向下,向左下移動。兩人輪流操作,將任何乙個 queen 移動到 0,0 的人獲勝。乙個位置上可以有很多 queen queen 移動時不需要考慮經過路徑上是否有 queen 題解 這個很像 nim 遊戲,不過這個遊...

體會棋盤遊戲

using namespace std void setdata int a 8 8 設定隨機數 void out int a 8 8 輸出陣列 void outdiagonal int a 8 8 輸出對角線元素的值 void mine int a 8 8 int x,int y 按 掃雷 遊戲的...