解题思路:见代码内注释。需要注意的是,之所以在四个放置角上的元素时使用了多个循环视为了,屏蔽掉之前已经放置好的的最小元素。
3×3矩阵举例
编写程序:
#include<stdio.h>
int main(){
int *fun(int a[5][5]); //函数声明
int m[5][5]={0}; //定义一个接收输入矩阵的二维数组
int i,*p=m[0]; //输入用指针并初始化
printf("输入5x5的矩阵:\n");
for(i=0;i<25;i++)
scanf("%d",p++);
printf("重新排列得:\n");
for(i=0,p=fun(m);i<25;i++){
printf("%2d",*p++); //控制每行输出元素间隔
if((i+1)%5==0)
printf("\n");
}
return 0;
}
/*--排列函数--*/
int *fun(int a[5][5]){
int i,j,tmpe,*max,*min;
int *b[25],*p=&a[0][0];
for(i=0;i<25;i++)
b[i]=p++; //指向原二维数组各元素的指针数组
/*--中心元素--*/
for(i=1,max=b[0];i<25;i++){
if(*max<*b[i])
max=b[i];
}
//将元素值交换
tmpe=*b[12];
*b[12]=*max;
*max=tmpe;
//左上角元素
for(i=1,min=b[0];i<25;i++){
if(*min>*b[i])
min=b[i];
}
//元素值交换
tmpe=*b[0];
*b[0]=*min;
*min=tmpe;
//左上角元素
for(i=2,min=b[1];i<25;i++){
if(*min>*b[i])
min=b[i];
}
//元素值交换
tmpe=*b[4];
*b[4]=*min;
*min=tmpe;
/*--左下角元素--*/
for(i=1,min=b[1];i<4;i++){
if(*min>*b[i])
min=b[i];
}
for(i=5;i<25;i++){
if(*min>*b[i])
min=b[i];
}
//元素值交换
tmpe=*b[20];
*b[20]=*min;
*min=tmpe;
/*--右下角第四小元素--*/
for(i=1,min=b[1];i<4;i++){ //先在数组左上角元素和右上角元素之间找最小元素
if(*min>*b[i])
min=b[i];
}
for(i=5;i<20;i++){ //再从右上角元素和左下角元素之间找最小元素
if(*min>*b[i])
min=b[i];
}
for(i=21;i<25;i++){ //最后从左下角元素之后找最小值
if(*min>*b[i])
min=b[i];
}
//元素值交换
tmpe=*b[24];
*b[24]=*min;
*min=tmpe;
return(b[0]); //将排列好的指针数组的首元素以指针形式返回
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/82655.html