題幹:
行交換操作:選擇矩陣的任意兩行,交換這兩行(即交換對應格仔的顏色)
列交換操作:選擇矩陣的任意行列,交換這兩列(即交換對應格仔的顏色)
遊戲的目標,即通過若干次操作,使得方陣的主對角線(左上角到右下角的連線)上的格仔均為黑色。對於某些關卡,小q百思不得其解,以致他開始懷疑這些關卡是不是根本就是無解的!於是小q決定寫乙個程式來判斷這些關卡是否有解。
題解:
其實這道題我們手模幾個滿足題幹的狀態就可知:每一縱列與每一橫行的交點(1)一定是獨一無二的。
0 0 0 1 0 1 0 0
1 0 0 0 1 0 0 0
0 0 1 0 0 0 0 1
0 1 0 0 0 0 1 0
(上表其餘位置均可填1)
比較容易(太難了!!)就可以想到:每個黑點所對應的橫縱座標(x,y)所對應的就是乙個二分圖。
我們觀察這兩個表:每個點的橫豎都沒有黑點(1),或者說,其餘的黑點對最終結果不造成任何影響(包括好的或壞的)。
當橫縱座標的值存在一一匹配的情況,就一定有解。
那就用匈牙利演算法來解決好了。(都快忘了。。。)
code:
1 #include2 #include3 #include4 #include5view code#define $ 222
6using
namespace
std;
7int
b[$][$],m,n,ans,t,sum,first[$],tot,start[$];
8bool
judge[$];
9struct treea[$*$];
10 inline void add(int x,int
y);12 first[x]=tot;
13/*
a[++tot]=(tree);
14first[y]=tot;
*/15
}16 inline bool km(int
x)22}23
return0;
24}25 inline void
work()
37if(sum"
no"); return
; }
38for(register int i=1;i<=n;++i)
42 ans==n?puts("
yes"):puts("no"
);43}44
signed main()
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 顯然目標狀...