ZJOI2007 矩陣遊戲

2022-07-22 16:15:29 字數 1744 閱讀 1011

行交換操作:選擇矩陣的任意兩行,交換這兩行(即交換對應格仔的顏色)

列交換操作:選擇矩陣的任意兩列,交換這兩列(即交換對應格仔的顏色)

遊戲的目標,即通過若干次操作,使得方陣的主對角線(左上角到右下角的連線)上的格仔均為黑色。

對於某些關卡,小q百思不得其解,以致他開始懷疑這些關卡是不是根本就是無解的!!於是小q決定寫乙個程式來判斷這些關卡是否有解。

輸入格式:

第一行包含乙個整數t,表示資料的組數。

接下來包含t組資料,每組資料第一行為乙個整數n,表示方陣的大小;接下來n行為乙個n*n的01矩陣(0表示白色,1表示黑色)。

輸出格式:

包含t行。對於每一組資料,如果該關卡有解,輸出一行yes;否則輸出一行no。

輸入樣例#1:

2

20 0

0 13

0 0 1

0 1 0

1 0 0

輸出樣例#1:

no

yes

對於20%的資料,n ≤ 7

對於50%的資料,n ≤ 50

對於100%的資料,n ≤ 200

也許有人一開始看到題目就想到搜尋??    

但一想到搜尋就有點.............不爽........

說一下正解。

其實這是一道二分圖匹配的問題。

關鍵在於建模,如果(i,j)點所給出的點值為1的話,那我們就建一條從i到j的邊,建完邊後就進行二分圖匹配,如果可以完全匹配(即全部匹配數為n),則方陣的主對角線是可以全為黑色的,否則不能。

為什麼呢?

我們可以手工模擬一下,比如說樣例的第二個測試資料。

根據我上面說的,我們會建這幾條邊:

然後,我們將矩陣的第一行和第二行交換下試試??

得到下面的:

發現交換後的有什麼差別??

其實只是將第一張右邊的一二兩點交換,然後重新編號而已,其他還是不變的!!

我們再看一看這個測試點的最終狀態:

1 0 0

0 1 0

0 0 1

對應的圖為:

最後狀態是圖是一對一的,所以從上面我們就可以知道,其實只要建的圖能完全匹配就行,因為無論是交換行還是列,都是不會改變匹配數的。

#include#include

#define n 210

using

namespace

std;

intmatch[n][n];

intresult[n];

bool

use[n];

intn;

bool dfs(int

now)

}return

false;}

bool

xiongyali()

if(ans == n)return

true

;

else

return

false;}

intmain()

return0;

}

ZJOI2007 矩陣遊戲

霧。既然我們要求每行每列都要有乙個 1 那麼我們就可以這樣進行建立了這個二分圖。左邊有 n 個點,代表行,右邊有 n 個點,代表列。做這題的主要目的是打板子 二分圖匹配用的dinic bzoj 1059 這裡寫鏈結內容 include include include include include ...

ZJOI2007 矩陣遊戲

我們發現同行同列的點無論經過多少次變換仍然同行或同列,所以題目可轉換為能不能找到n個互相不同行或同列的點。那麼我們用二分圖求一下最大匹配即可。include using namespace std const int n 205 int t,n,x,ans int match n 1 bool vi...

ZJOI2007 矩陣遊戲

這道題是乙個不錯的題,難點就在於建模。交換操作過程中,同一行的黑塊是不會被拆開,同理縱塊也是。接著目標狀態就是一條對角線上全都是黑塊。我們倒過來想,看看能否從目標狀態變成初始狀態。對於所有的黑塊 x,y 左邊行右邊列,點分行列 我們連條邊 x leftarrow rightarrow y 顯然目標狀...