洛谷 P1129 [ZJOI2007]矩陣遊戲
阿新 • • 發佈:2017-08-24
show dfs color 輸出 他還 pro == 表示 %d
題目描述
小Q是一個非常聰明的孩子,除了國際象棋,他還很喜歡玩一個電腦益智遊戲――矩陣遊戲。矩陣遊戲在一個N*N黑白方陣進行(如同國際象棋一般,只是顏色是隨意的)。每次可以對該矩陣進行兩種操作:
行交換操作:選擇矩陣的任意兩行,交換這兩行(即交換對應格子的顏色)
列交換操作:選擇矩陣的任意兩列,交換這兩列(即交換對應格子的顏色)
遊戲的目標,即通過若幹次操作,使得方陣的主對角線(左上角到右下角的連線)上的格子均為黑色。
對於某些關卡,小Q百思不得其解,以致他開始懷疑這些關卡是不是根本就是無解的!!於是小Q決定寫一個程序來判斷這些關卡是否有解。
輸入輸出格式
輸入格式:
第一行包含一個整數T,表示數據的組數。
接下來包含T組數據,每組數據第一行為一個整數N,表示方陣的大小;接下來N行為一個N*N的01矩陣(0表示白色,1表示黑色)。
輸出格式:
包含T行。對於每一組數據,如果該關卡有解,輸出一行Yes;否則輸出一行No。
輸入輸出樣例
輸入樣例#1:2 2 0 0 0 1 3 0 0 1 0 1 0 1 0 0輸出樣例#1:
No Yes
說明
對於20%的數據,N ≤ 7
對於50%的數據,N ≤ 50
對於100%的數據,N ≤ 200
可以看出目標狀態每行只有一個點
所以我們每次只移動一個點就好了
最後判斷是否移動n個點就好了
屠龍寶刀點擊就送
#include <cstring> #include <cstdio> #define N 205 bool vis[N]; int T,n,Map[N][N],ans,ok[N]; bool dfs(int x) { for(int i=1;i<=n;++i) if(Map[x][i]&&!vis[i]) { vis[i]=1; if(!ok[i]||dfs(ok[i])) { ok[i]=x;return true; } } return false; } int main() { scanf("%d",&T); for(;T--;) { scanf("%d",&n); memset(ok,0,sizeof(ok)); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) scanf("%d",&Map[i][j]); ans=0; for(int i=1;i<=n;++i) { memset(vis,0,sizeof(vis)); if(dfs(i)) ans++; } if(ans==n) puts("Yes"); else puts("No"); } return 0; }
洛谷 P1129 [ZJOI2007]矩陣遊戲