384b
来源:互联网 发布:ubuntu jira部署 编辑:程序博客网 时间:2024/06/10 01:03
/*题目意思:给出n个数组,每个数组包括m个数字,当k = 0 时,需要把n个数组都按照从小到大的顺序排列,k = 1则把n个数组里面的数字按照从大到小的顺序排列。直接模拟即可,不过有个地方注意下是可以减少工作量的,当处理第 i 行的时候,不再需要移动前 i - 1 行的数组下标。因为前 i - 1行的数组都排好序了*/#include<stdio.h>#include<algorithm>#define N 1005using namespace std;int a[N][N],b[N][3];int main(){ int i,j,k,ma,cnt,u,p,n,m,l; while(scanf("%d%d%d",&n,&m,&p)!=EOF) { cnt=0; for(i=1;i<=n;i++) for(j=1;j<=m;j++) scanf("%d",&a[i][j]); for(i=1;i<=n;i++) { for(j=1;j<m;j++) { ma=a[i][j]; u=j; for(k=j+1;k<=m;k++) { if((ma>a[i][k]&&p==0)||(ma<a[i][k]&&p==1)) { ma=a[i][k]; u=k; } } if(u!=j) { swap(a[i][j],a[i][u]); if(p==0) { b[cnt][0]=j; b[cnt][1]=u; } else { b[cnt][0]=u; b[cnt][1]=j; } cnt++; for(l=i+1;l<=n;l++) { if((a[l][j]>a[l][u]&&p==0)||(a[l][j]<a[l][u]&&p==1)) { swap(a[l][j],a[l][u]); } } } } } printf("%d\n",cnt); for(i=0;i<cnt;i++) printf("%d %d\n",b[i][0],b[i][1]); } return 0;}/* k = 0:从小到大排列。意味着所有数组中的第一个数是最小的!这个最小的数如何找?无非就在该行中的某一个数里面。由于不确定在哪里,但用两重循环势必能找出,于是就有了以下简单的方法:对于i = 1,a[i] 可能不是最小的数,于是不断地跟a[i+1], a[i+2], ..., a[m] 比较,即找出排在第一个的数输出 1, 2; 1, 3; ...; 1, m 即可,这样能能保证每个数组都能找出最小的数。第二个最小的数就是2, 3; 2, 4; ...; 2, m了,后面的依次类推。但主要题目中说的,当第 i 个位置的 value > 第 j 个位置的 value 才能交换这个条件。k = 1 则是2, 1; 3, 1; ...; m 1 输出 。*/#include<stdio.h>int main(){ int n,m,k,i,j,a; while(scanf("%d%d%d",&n,&m,&k)!=EOF) { for(i=1;i<=n;i++) for(j=1;j<=m;j++) scanf("%d",&a); printf("%d\n",m*(m-1)/2); for(i=1;i<=m;i++) { for(j=i+1;j<=m;j++) if(k==0) printf("%d %d\n",i,j); else printf("%d %d\n",j,i); } } return 0;}
0 0