题意:输入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 "); 67 else 68 printf("NO "); 69 } 70 return 0; 71 }