题目描述
要求将一个n×n矩阵中的最大元素放在中心,4个角分别放4个最小的元素(按从左到右、从上到下的顺序依次从小到大存放)。若有多个同一类元素,则优先选择行号小的,若行号相同则优先选择列号小的。注意,放置元素时通过交换操作实现,具体参看样例。
输入格式
测试数据有多组,处理到文件尾。每组测试的第一行输入自然数n(n为奇数且3≤n≤11),第二行开始的n行每行输入n个不超过2位的整数。
输出格式
对于每组测试,输出将矩阵中的最大元素和4个最小元素放到指定的位置后的矩阵。每行的各个数据之间留一个空格。
输入样例
在这里给出一组输入。例如:
5
96 69 0 56 50
21 54 87 46 40
56 38 24 98 51
0 2 88 43 55
65 60 26 73 88
输出样例
在这里给出相应的输出。例如:
0 69 96 56 0
88 54 87 46 40
56 38 98 24 51
50 65 88 43 55
2 60 26 73 21
【思路】:将元素输入二维数组同时转化出一个一维数组,做选择法排序之后,数组中前4位就是4个最小值升序排列 最大值为最后一个元素,对二维数组然后将其与需要交换的元素交换,然后转化为二维数组;找出其中最大值,与中心元素交换,输出二维数组
#include<stdio.h>
void sort( int a[], int n )//选择法排序
{
int t;
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n;j++)
if(a[i]>a[j]&&i<j)
{
t=a[j];
a[j]=a[i];
a[i]=t;
}
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int N=n*n,t;
int b[N],a[n][n];
int l,i,j,x=0,y=0,z=0,p=0,q=0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
b[l++]=a[i][j];
}
}
sort(b,N);//一维排序
for(i=0;i<n;i++) /第一小
{x=0;
for(j=0;j<n;j++)
{
if(a[i][j]==b[0])
{
t=a[0][0];
a[0][0]=b[0];
a[i][j]=t;
x=1;
break;
}
}
if(x==1)break;
}
for(i=0;i<n;i++)/// //第二小
{ x=0;
for(j=0;j<n;j++)
{
if(a[i][j]==b[1]&&i!=0||a[i][j]==b[1]&&j!=0)
{
t=a[0][n-1];
a[0][n-1]=b[1];
a[i][j]=t;
x=1;
break;
}
}
if(x==1)break;
}
for(i=0;i<n;i++)/第三小
{x=0;
for(j=0;j<n;j++)
{
if(a[i][j]==b[2]&&(i!=0&&j!=0)||a[i][j]==b[2]&&(i!=0&&j!=n-1))
{
t=a[n-1][0];
a[n-1][0]=b[2];
a[i][j]=t;
x=1;
break;
}
}
if(x==1)break;
}
for(i=0;i<n;i++)/第四小
{x=0;
for(j=0;j<n;j++)
{
if(a[i][j]==b[3]&&(i!=0&&j!=0)||a[i][j]==b[3]&&(i!=0&&j!=n-1)||a[i]
[j]==b[3]&&(i!=n-1&&j!=0))
{
t=a[n-1][n-1];
a[n-1][n-1]=b[3];
a[i][j]=t;
x=1;
break;
}
}
if(x==1)break;
}
for(i=0;i<n;i++)/最大
{x=0;
for(j=0;j<n;j++)
{
if(a[i][j]==b[N-1])
{
t=a[n/2][n/2];
a[n/2][n/2]=b[N-1];
a[i][j]=t;
}
}
if(x==1)break;
}
for(i=0;i<n;i++)
{
for(j=0;j<n-1;j++)
{
printf("%d ",a[i][j]);
}
printf("%d",a[i][j]);
if(i!=n-1){printf("\n");}
}
}
return 0;
}