题目:输入一个5x5矩阵,将其中最大的元素移到中心,4个角分别放4个最小的元素(顺序从左到右,从上到下以此从小到大存放)
思路:最大值是最好找的,循环遍历一次,找出最大值和其地址。然后就是找最小的那4个数字,我的思路是首先用一数组来存放二维数组的第一行,然后从第二行开始遍历,从该数组b中最大的元素开始比较,首先小于哪一个就替换掉哪一个,最后b数组中就是二维数组中最小的5个数。然后就是找到这4个数的地址,一开始我没有加flag标记,那样一旦二维数组中存在两个相同的数,程序就崩溃了。意识到这一点后,我给每一个数设了一个对应的flag1,flag2等,一旦找到了一个,取这个地址后,同时设置flag为1,表示这个数已经取过地址了。最后,输出即可。
1 #include<stdio.h> 2 int main(){ 3 void sort(int q[]); 4 int a[5][5]; 5 int b[5]; 6 int max=0,temp; 7 int flag1=0,flag2=0,flag3=0,flag4=0; 8 int *p; 9 int *p1,*p2,*p3,*p4; 10 for(int i=0;i<5;i++) 11 for(int j=0;j<5;j++) 12 scanf("%d",&a[i][j]); 13 for(int i=0;i<5;i++) 14 b[i]=a[0][i]; 15 16 for(int i=0;i<5;i++){ 17 for(int j=0;j<5;j++){ 18 if(a[i][j]>max) {max=a[i][j]; p=&a[i][j];} 19 } 20 } 21 for(int i=1;i<5;i++){ 22 for(int j=0;j<5;j++){ 23 for(int k=4;k>=0;k--){ 24 if(a[i][j]<b[k]) { 25 b[k]=a[i][j]; 26 sort(b);break; 27 } 28 } 29 } 30 } 31 for(int i=0;i<5;i++){ 32 for(int j=0;j<5;j++){ 33 if(a[i][j]==b[0]&&flag1==0) {p1=&a[i][j];flag1=1;} 34 else if(a[i][j]==b[1]&&flag2==0) {p2=&a[i][j];flag2=1;} 35 else if(a[i][j]==b[2]&&flag3==0){p3=&a[i][j];flag3=1;} 36 else if(a[i][j]==b[3]&&flag4==0) {p4=&a[i][j];flag4=1;} 37 } 38 } 39 *p=a[2][2];a[2][2]=max; 40 *p1=a[0][0];a[0][0]=b[0]; 41 *p2=a[0][4];a[0][4]=b[1]; 42 *p3=a[4][0];a[4][0]=b[2]; 43 *p4=a[4][4];a[4][4]=b[3]; 44 printf(" "); 45 for(int i=0;i<5;i++){ 46 for(int j=0;j<5;j++){ 47 printf("%d ",a[i][j]); 48 } 49 printf(" "); 50 } 51 } 52 //排序 53 void sort(int q[]){ 54 int temp1; 55 for(int i=0;i<5;i++){ 56 for(int j=i+1;j<5;j++){ 57 if(q[i]>q[j]){ 58 temp1=q[i];q[i]=q[j];q[j]=temp1; 59 } 60 } 61 } 62 }
运行结果: