加载中...

统计当交换顺序时候获得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;
}


posted @ 2022-09-06 19:37  liang302  阅读(40)  评论(0编辑  收藏  举报