1. 程式人生 > 資訊 >Ubuntu 21.10 將於 10 月 14 日釋出,代號“頑皮的狐猴”

Ubuntu 21.10 將於 10 月 14 日釋出,代號“頑皮的狐猴”

[ZJOI2007] 矩陣遊戲

題目描述

小 Q 是一個非常聰明的孩子,除了國際象棋,他還很喜歡玩一個電腦益智遊戲――矩陣遊戲。矩陣遊戲在一個 $n \times n$ 黑白方陣進行(如同國際象棋一般,只是顏色是隨意的)。每次可以對該矩陣進行兩種操作: - 行交換操作:選擇矩陣的任意兩行,交換這兩行(即交換對應格子的顏色)。 - 列交換操作:選擇矩陣的任意兩列,交換這兩列(即交換對應格子的顏色)。 遊戲的目標,即通過若干次操作,使得方陣的主對角線(左上角到右下角的連線)上的格子均為黑色。 對於某些關卡,小 Q 百思不得其解,以致他開始懷疑這些關卡是不是根本就是無解的!於是小 Q 決定寫一個程式來判斷這些關卡是否有解。

輸入輸出格式

輸入格式

**本題單測試點內有多組資料**。 第一行包含一個整數 $T$,表示資料的組數,對於每組資料,輸入格式如下: 第一行為一個整數,代表方陣的大小 $n$。 接下來 $n$ 行,每行 $n$ 個非零即一的整數,代表該方陣。其中 $0$ 表示白色,$1$ 表示黑色。

輸出格式

對於每組資料,輸出一行一個字串,若關卡有解則輸出 `Yes`,否則輸出 `No`。

輸入輸出樣例

輸入樣例 #1

2
2
0 0
0 1
3
0 0 1
0 1 0
1 0 0

輸出樣例 #1

No
Yes

說明

#### 資料規模與約定 - 對於 $20\%$ 的資料,保證 $n \leq 7$。 - 對於 $50\%$ 的資料,保證 $n \leq 50$。 - 對於 $100\%$ 的資料,保證 $1 \leq n \leq 200$,$1 \leq T \leq 20$。
 1
#include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 #include <iostream> 5 6 using namespace std; 7 const int N = 300; 8 int t; 9 int g[N][N]; 10 int match[N]; 11 int vis[N], now; 12 int n; 13 14 void inint() 15 { 16 scanf("%d",&n); 17 memset(g, 0
, sizeof g); 18 memset(match, 0, sizeof match); 19 for(int i = 1; i <= n; i++) 20 { 21 for(int j = 1; j <= n; j++) 22 { 23 scanf("%d",&g[i][j]); 24 } 25 } 26 } 27 28 bool find(int x) 29 { 30 for(int i = 1; i <= n; i++) 31 { 32 if(g[x][i]) 33 { 34 if(vis[i] != now) 35 { 36 vis[i] = now; 37 if(!match[i] || find(match[i])) 38 { 39 match[i] = x; 40 return 1; 41 } 42 } 43 } 44 } 45 return 0; 46 } 47 48 void work() 49 { 50 int res = 0; 51 for(int i = 1; i <= n; i++) 52 { 53 now++; 54 if(find(i)) res++; 55 } 56 if(res == n) puts("Yes"); 57 else puts("No"); 58 } 59 60 int main() 61 { 62 scanf("%d",&t); 63 while(t--) 64 { 65 inint(); 66 work(); 67 } 68 return 0; 69 }