列表排序
其实只要把行和列交换的顺序换一下就可以了 比赛的时候一直想着先交换行再交换列 正解是先交换列 再交换行
#include<bits/stdc++.h>
using namespace std;
int a[40][40],n,m;
bool check()
{
int i,j,ans=0;
for(i=1;i<=n;i++)
{
ans=0;
for(j=1;j<=m;j++)
{
if(a[i][j]!=j)
{
ans++;
}
if(ans>2)
return false;
}
}
return true;
}
int main()
{
int i,j,k;
cin>>n>>m;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
cin>>a[i][j];
}
for(i=1;i<=m;i++)
{
for(j=i;j<=m;j++)
{
for(k=1;k<=n;k++)
swap(a[k][i],a[k][j]);
if(check())
{
puts("YES");
return 0;
}
for(k=1;k<=n;k++)
swap(a[k][i],a[k][j]);
}
}
puts("NO");
return 0;
}