您的位置:首页 > 其它

Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) B

2016-10-09 11:59 435 查看
题意:

给定矩阵。每行可以换1次,可以交换依次列。

思路:

数据很小,暴力交换列,行中不符合要求位置的是否小于二,小于二就YES。否则NO

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
int col,row;
int a[25][25];
int b[25][25];
int c[25][25];
int hang[25];

int change=0;

int solve(int x,int y)
{
for(int i=1;i<=row;i++)
{
int temp=c[i][x];
c[i][x]=c[i][y];
c[i][y]=temp;
}
memset(hang,0,sizeof(hang));
for(int i=1;i<=row;i++)
{
for(int j=1;j<=col;j++)
{
if(a[i][j]!=c[i][j])
hang[i]++;
}
}
for(int i=1;i<=row;i++)
if(hang[i]>2)
{
return 0;
}
return 1;
}
int main()
{
cin>>row>>col;
for(int i=1;i<=row;i++)
{
for(int j=1;j<=col;j++)
{
cin>>a[i][j];
b[i][j]=a[i][j];
}
}
for(int i=1;i<=row;i++)
{
sort(&a[i][1],&a[i][col+1]);
}
for(int i=1;i<=row;i++)
{
for(int j=1;j<=col;j++)
{
if(a[i][j]!=b[i][j])
hang[i]++;
}
}
int tt=0;
for(int i=1;i<=row;i++)
if(hang[i]>2)
{
tt=1;
break;
}
if(tt==0)
{
cout<<"YES"<<endl;
return 0;
}
else
{
int g=0;
for(int i=1;i<=col;i++)
{ if(g==1)
break;
for(int j=1;j<=col;j++)
{
for(int k=1;k<=row;k++)
{
for(int m=1;m<=col;m++)
c[k][m]=b[k][m];
}
if(i!=j)
{
g=solve(i,j);
if(g==1)
break;
}
}

}
if(g==0)
cout<<"NO"<<endl;
else
cout<<
4000
"YES"<<endl;
return 0;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐