方法一:用数组的方法实现。
#include<stdio.h>
#define M 25
int main()
{
int pp[M]={3,2,25,21,14,6,7,8,10,9,13,12,11,5,15,16,20,18,19,17,4,22,23,24,1};
int i,j;
printf("未进行调整的(5*5)矩阵:\n\n");
for(i=0;i<25;i++)
{
printf("%4d",pp[i]);
if((i+1)%5==0)
printf("\n");
}
printf("\n\n");
for(i=0;i<M-1;i++) //冒泡排序法
{
for(j=i+1;j<M;j++)
{
if(pp[i]>pp[j])
{
int temp;
temp=pp[j];
pp[j]=pp[i];
pp[i]=temp;
}
}
}
for(i=0;i<25;i++)
{
if(i==4)
{
int temp;
temp=pp[i];
pp[i]=pp[1];
pp[1]=temp;
}
if(i==12)
{
int temp;
temp=pp[i];
pp[i]=pp[24];
pp[24]=temp;
}
if(i==20)
{
int temp;
temp=pp[i];
pp[i]=pp[2];
pp[2]=temp;
}
if(i==24)
{
int temp;
temp=pp[i];
pp[i]=pp[3];
pp[3]=temp;
}
}
printf("进行调整后的(5*5)矩阵:\n\n");
for(i=0;i<25;i++)
{
printf("%4d",pp[i]);
if((i+1)%5==0)
printf("\n");
}
}
第二种方法是在第一种方法上的扩展实现的,可以实现多种功能。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int i,j,M;
void sun(int *num,int n);
main()
{
int ret,n;
do{
printf("请输入你想进行 (n*n) 的矩阵,请注意输入的数字必须大于2和必须是奇数:");
scanf("%d",&n);
if(n%2==0)
{
printf("输入错误!请重新输入。\n");
ret=1;
}
else
ret=0;
}while(ret);
M=n*n; //计算n*n的矩阵
int pp[M];
printf("\n本程序不需要输入位数,由程序自动产生0~100随机数。\n");
srand((unsigned int)time(NULL));
for(i=0;i<M;i++)
pp[i]=rand()%100; //随机产生0~100的整正数
printf("\n未进行调整的(%d*%d)矩阵:\n\n",n,n);
for(i=0;i<M;i++)
{
printf("%4d",pp[i]);
if((i+1)%n==0)
printf("\n");
}
sun(pp,n);
}
void sun(int *num,int n)
{
/*首先用冒泡排序法。
则可以知道前面4位数为最小4位,最后一位最大值。*/
int middle_max;
middle_max=(n*n)/2; //中间最大值
printf("\n\n");
for(i=0;i<M-1;i++) //冒泡排序法
{
for(j=i+1;j<M;j++)
{
if(*(num+i)>*(num+j))
{
int temp;
temp=*(num+j);
*(num+j)=*(num+i);
*(num+i)=temp;
}
}
}
printf("进行冒泡排序法调整后的(%d*%d)矩阵:\n\n",n,n);
for(i=0;i<M;i++)
{
printf("%4d",*(num+i));
if((i+1)%n==0)
printf("\n");
}
printf("\n\n");
//右上角已经是第一小值了
for(i=0;i<M;i++)
{
if(i==(n-1)) //左上角,存放第二小值。
{
int temp;
temp=*(num+n-1);
*(num+n-1)=*(num+1);
*(num+1)=temp;
}
if(i==middle_max) //中间,存放最大值。中间一个和最后一个交换。
{
int temp;
temp=*(num+middle_max);
*(num+middle_max)=*(num+(n*n-1));
*(num+(n*n-1))=temp;
}
if(i==(n*n-n)) //右下角,存放第三小值。
{
int temp;
temp=*(num+(n*n-n));
*(num+(n*n-n))=*(num+2);
*(num+2)=temp;
}
if(i==(n*n-1)) //左下角,存放第四小值。
{
int temp;
temp=*(num+(n*n-1));
*(num+(n*n-1))=*(num+3);
*(num+3)=temp;
}
}
printf("进行调整后的(%d*%d)矩阵:\n\n",n,n);
for(i=0;i<M;i++)
{
printf("%4d",*(num+i));
if((i+1)%n==0)
printf("\n");
}
}