題意:輸入n,m,表示一個n行m列的矩陣,每一行數字都是1-m,順序可能是亂的,每一行可以交換任意2個數的位置,並且可以交換任意2列的所有數 問是否可以使每一行嚴格遞增
思路:暴力列舉所有可能的列變換 然後在所有可能的情況下求是否存在一種情況可以使每一行最多進行一次交換最後得到嚴格遞增的矩陣
AC程式碼:
1 #include "iostream" 2 #include "stdio.h" 3 #include "string.h" 4 using namespace std; 5 6 int arr[50][50],n,m; 7 bool fun(int k) 8 { 9 int c=0; 10 for(int i=0; i<m; i++) 11 { 12 if(arr[k][i] != i+1) 13 c++; 14 } 15 if(c==0 || c==2) 16 return 1; 17 return 0; 18 } 19 20 int main() 21 { 22 int t,r,c,flag,flag0; 23 while(scanf("%d%d",&n,&m)!=EOF) 24 { 25 for(int i=0; i<n; i++) 26 for(int j=0; j<m; j++) 27 cin>>arr[i][j]; 28 29 for(int i=0; i<m; i++) 30 { 31 for(int j=0; j<m; j++) 32 { 33 if(i>j) continue; 34 for(int k=0; k<n; k++) 35 { 36 t = arr[k][i]; 37 arr[k][i] = arr[k][j]; 38 arr[k][j] = t; 39 } 40 flag=1; 41 flag0=0; 42 for(int k=0; k<n; k++) 43 { 44 if(!fun(k)) 45 { 46 flag=0; 47 break; 48 } 49 } 50 if(flag) 51 { 52 flag0=1; 53 break; 54 } 55 for(int k=0; k<n; k++) 56 { 57 t = arr[k][i]; 58 arr[k][i] = arr[k][j]; 59 arr[k][j] = t; 60 } 61 } 62 if(flag0) 63 break; 64 } 65 if(flag0) 66 printf("YES\n"); 67 else 68 printf("NO\n"); 69 } 70 return 0; 71 }