Problem D: C语言习题 矩阵元素变换
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 389 Solved: 198
[ Submit][ Status][ Web Board]
Description
将一个n×n(2<n<10,n为奇数)的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(按从左到右、从上到下顺序依次从小到大存放),写一
函数实现。用main函数调用。
函数实现。用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;
}