放置最值元素

题目描述

要求将一个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;
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值