Problem D: C语言习题 矩阵元素变换

功能测试中,如有问题请联系17862809558 17862818011 18865513850 18865513930

Problem D: C语言习题 矩阵元素变换

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 389   Solved: 198
[ Submit][ Status][ Web Board]

Description

将一个n×n(2<n<10,n为奇数)的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(按从左到右、从上到下顺序依次从小到大存放),写一
函数实现。用main函数调用。

Input

输入n和矩阵中的每个元素

Output

变换后的矩阵

Sample Input

5
25 13 9 5 1
16 17 18 19 6
15 24 4 20 7
14 23 22 21 8
2 12 11 10 3

Sample Output

1 13 9 5 2 
16 17 18 19 6 
15 24 25 20 7 
14 23 22 21 8 
3 12 11 10 4 

  
  
#include <iostream>
using namespace std;
 
void change( int *k, int p)
{
     int t,*min,*max,i,j;
     min=max=k;
     for (i=0; i<p; i++)
         for (j=0; j<p; j++)
         {
             if (*(k+p*i+j)<*min)
                 min=k+p*i+j;
             else if (*(k+p*i+j)>*max)
                 max=k+p*i+j;
         }
     t=*max;
     *max=*(k+(p*p)/2);
     *(k+(p*p)/2)=t;
     t=*min;
     *min=*k;
     *k=t;
 
     min=&*(k+1);
     for (i=0; i<p; i++)
         for (j=0; j<p; j++)
             if ((k+p*i+j)!=k)
                 if (*(k+p*i+j)<*min)
                     min=k+p*i+j;
     t=*min;
     *min=*(k+p-1);
     *(k+p-1)=t;
     min=&*(k+1);
     for (i=0; i<p; i++)
         for (j=0; j<p; j++)
             if ((k+p*i+j)!=(k+p-1)&&(k+p*i+j)!=k)
                 if (*(k+p*i+j)<*min)
                     min=k+p*i+j;
     t=*min;
     *min=*(k+p*(p-1));
     *(k+p*(p-1))=t;
     min=&*(k+1);
     for (i=0; i<p; i++)
         for (j=0; j<p; j++)
             if ((k+p*i+j)!=k&&(k+p*i+j)!=(k+p-1)&&(k+p*i+j)!=(k+p*(p-1)))
                 if (*(k+p*i+j)<*min)
                     min=k+p*i+j;
     t=*min;
     *min=*(k+p*p-1);
     *(k+p*p-1)=t;
}
int main()
{
     void change( int *, int );
     int **a,*p,i,j;
     int n;
     cin>>n;
     p= new int [n*n];
     a= new int *[n];
     for (i=0; i<n; i++)
         a[i]=p+n*i;
     for (i=0; i<n; i++)
         for (j=0; j<n; j++)
             cin>>a[i][j];
     change(p,n);
     for (i=0; i<n; i++)
     {
         for (j=0; j<n; j++)
             cout<<a[i][j]<< " " ;
         cout<<endl;
     }
     delete []p;
     delete []a;
     return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值