统计当交换顺序时候获得1-m排列的时候 需要执行的次数(不需要相邻)
https://www.acwing.com/problem/content/4613/
可以进行操作
选择一行中的两个整数并交换它们。此操作,每行最多只能执行一次。
选择列表中的两列并交换它们。此操作,最多只能执行一次。
能否使得最终列表中每一行的 m 个整数都能按照 1,2,…,m 的顺序排列。
这里因为方案数量较小 可以爆搜 先交换两列 再判断 完事再换回来
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n,m;
const int N = 25;
int g[N][N];
bool check(){
for (int i = 0; i < n; i ++ ){
int cnt=0;
for (int j = 0; j < m; j ++ ){
if(g[i][j]!=j+1){
cnt++;
}
}
if(cnt>2){
return false;
}
}
}
int main()
{
cin >> n>>m;
for (int i = 0; i < n; i ++ ){
for (int j = 0; j < m; j ++ ) cin >> g[i][j];
}
for (int i = 0; i < m; i ++ ){
for (int j = i; j < m; j ++ ){
for (int k = 0; k < n; k ++ ){
swap(g[k][i],g[k][j]);
}
if(check()){
cout << "YES"<<endl;
return 0;
}
for (int k = 0; k < n; k ++ ){
swap(g[k][i],g[k][j]);
}
}
}
cout << "NO"<<endl;
return 0;
}