
题目链接:http://codeforces.com/problemset/problem/724/B
题目大意:
给出N*M矩阵,对于该矩阵有两种操作:
(保证,每行输入的数是 1-m 之间的数且不重复)
1.交换两列,对于整个矩阵只能操作一次
2.每行交换两个数。
交换后是否可以使每行都是1-m 数字递增。
解题思路:
1.得到矩阵后先判断,是否每行可以交换两个数可以得到递增的矩阵,如果可以则输出“YES”.
2.暴力交换两列,交换两列后,判断每行是否可以交换两个数得到递增的矩阵,如果可以则输出“YES”.
[注意:如果交换之后不可得到递增的矩阵,要记得将交换后的两列交换回来]
AC Code:
#include<bits/stdc++.h>
using namespace std; const int N=;
int na[N][N];
int n,m; int judge(int na[N][N])
{
for(int i=; i<=n; i++)
{
int cut=;
for(int j=; j<=m; j++)
if(na[i][j]!=j)cut++;
if(cut>)return ;
}
return ;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=; i<=n; i++)
for(int j=; j<=m; j++)
scanf("%d",&na[i][j]);
if(judge(na))
{
printf("YES\n");
continue;
}
int flag=;
for(int i=; i<=m; i++)
{
if(flag)break;
for(int j=i+; j<=m; j++)
{
if(flag)break;
for(int x=; x<=n; x++)swap(na[x][i],na[x][j]);
if(judge(na))flag=;
for(int x=; x<=n; x++)swap(na[x][i],na[x][j]);
}
}
printf("%s\n",flag?"YES":"NO");
}
return ;
}