这道题最关键的点在于:如何找到二维数组的四个最小值;
这里小编给出两种方法:
第一种:利用打擂台算法来找到最小值;代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define M 10
void set_array(int (*p)[5]) //数组指针接收实参二维数组
{
int i,j,k=0;
printf("调换前:\n");
for(i=0;i<5;i++) //为二维数组从1~25进行赋值
{
for(j=0;j<5;j++)
{
*(*(p+i)+j)=k+j+1;
printf("%5d ",*(*(p+i)+j));
}
printf("\n");
k=k+5;
}
}
void func(int (*p)[5]) //数组指针接收实参二维数组
{
int i,j,clow=0,row=0,min1,min2,min3,min4,max;//定义行,列,四个最小值,以及最大值,
//找最大值;
for(i=0,max=*(*p),clow=row=0;i<5;i++)
{
for(j=0;j<5;j++)
{
if(*(*(p+i)+j)>max)
{
max=*(*(p+i)+j); //打擂台算法找最大值
row=i;
clow=j;
}
}
}
*(*(p+row)+clow)=*(*(p+2)+2); //找到最大值与二维数组中间元素a【2】【2】进行调换
*(*(p+2)+2)=max;
//找最小值min1
for(i=0,min1=max,row=clow=0;i<5;i++) //先令min1为max,
{
for(j=0;j<5;j++)
{
if((*(*(p+i)+j))<min1) //当后面的数小于min1时,令min1=该数,就把min1的范围缩小了
{ min1=*(*(p+i)+j); //整个循环完毕后,min1就是最小的
row=i;
clow=j;
}
}
}
*(*(p+row)+clow)=*(*p); //将最小元素与左上角元素对调
*(*p)=min1;
//找最小值min2
for(i=0,min2=max,row=clow=0;i<5;i++) //令min2为最大值max
{
for(j=0;j<5;j++)
{
if((min1<*(*(p+i)+j))&&(*(*(p+i)+j)<min2))//当后面的数大于min1,并且小于min2时,令min2=该数,就把min2的范围缩小了
{ min2=*(*(p+i)+j); //整个循环完毕后,min2就是除min1以外最小的。
row=i;
clow=j;
}
}
}
*(*(p+row)+clow)=*(*p+4); //将最小元素与右上角元素对调
*(*p+4)=min2;
//找最小值min3
for(i=0,min3=max,row=clow=0;i<5;i++) //令min3为最大值max
{
for(j=0;j<5;j++)
{
if((min2<*(*(p+i)+j))&&(*(*(p+i)+j)<min3))//当后面的数大于min2,并且小于min3时,令min3=该数,就把min3的范围缩小了
{ min3=*(*(p+i)+j); 整个循环完毕后,min3就是除min1,min2以外最小的。
row=i;
clow=j;
}
}
}
*(*(p+row)+clow)=*(*(p+4)); //将最小元素与左下角元素对调
*(*(p+4))=min3;
//找最小值min4
for(i=0,min4=max,row=clow=0;i<5;i++) //令min4为最大值max
{
for(j=0;j<5;j++)
{
if((min3<*(*(p+i)+j))&&(*(*(p+i)+j)<min4)) //当后面的数大于min3,并且小于min4时,令min4=该数,就把min4的范围缩小了
{ min4=*(*(p+i)+j); //整个循环完毕后,min4就是除min1,min2,min3以外最小的。
row=i;
clow=j;
}
}
}
*(*(p+row)+clow)=*(*(p+4)+4); //将最小元素与右下角元素对调
*(*(p+4)+4)=min4;
}
void show_array(int (*p)[5])
{ printf("转换后:\n");
int i,j;
for(i=0;i<5;i++) //打印输出
{
for(j=0;j<5;j++)
{
printf("%5d ",*(*(p+i)+j));
}
printf("\n");
}
}
int main(void)
{ int a[5][5];
set_array(a); //调用赋值函数
func(a); //调用对调函数
show_array(a); //调用打印函数
return 0;
}
这里小编还有第二种方法:
将二维数组转化为一维数组,利用冒泡排序找出整个数组的前四位最小值;代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define M 10
void set_array(int (*p)[5]) //用数组指针指向实参二维数组
{
int i,j,k=0;
printf("调换前:\n");
for(i=0;i<5;i++) //为定义的二维数组赋值;
{
for(j=0;j<5;j++)
{
*(*(p+i)+j)=k+j+1;
printf("%5d ",*(*(p+i)+j));
}
printf("\n");
k=k+5;
}
}
void func(int (*p)[5])
{
int i,j,clow=0,row=0,b[25],max,temp=0,k[4],t;
//找最大值;
for(i=0,max=*(*p);i<5;i++) //利用打擂台算法找到最大值
{
for(j=0;j<5;j++)
{
if(*(*(p+i)+j)>max)
{
max=*(*(p+i)+j);
row=i;
clow=j;
}
}
}
*(*(p+row)+clow)=*(*(p+2)+2); //最大值与二维数组中心元素a【2】【2】进行调换
*(*(p+2)+2)=max;
//找四个最小值;
for(i=0;i<5;i++) //转化成一维数组;
{
for(j=0;j<5;j++)
{
b[temp]=*(*(p+i)+j);
temp++;
}
}
for(i=0;i<24;i++) //利用冒泡排序找出前四个最小值
{
for(j=0;j<24-i;j++)
{
if(b[j]>b[j+1])
{
t=b[j];
b[j]=b[j+1];
b[j+1]=t;
}
}
}
for(i=0;i<4;i++) //利用k【4】来存入前四个最小值
{
k[i]=b[i];
}
*(*p)=k[0]; //将四个角分别与四个最小值进行调换,
*(*(p)+4)=k[1];
*(*(p+4))=k[2];
*(*(p+4)+4)=k[3];
}
void show_array(int (*p)[5]) //用数组指针接收实参二维数组
{ printf("转换后:\n");
int i,j;
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
printf("%5d ",*(*(p+i)+j)); //打印输出
}
printf("\n");
}
}
int main(void)
{ int a[5][5];
set_array(a); //调用赋值函数
func(a); //调用对调函数
show_array(a); //调用打印函数
return 0;
}
总结:需要理解二维数组,以及数组指针的基本概念,熟练掌握打擂台算法以及冒泡排序算法。
小编感觉这道题虽然看起来很简单,但真正上手的时候会感到无从下手,需要我们扎实的基础知识。