将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从左到右,从上到下顺序依次从小到大存放),写一个函数实现之。用main函数调用。
注:只将最小的或最大的数交换到4个距阵的角上和距阵的中心,距阵的其它元素保留不变。
我想了好久也没有一个好的算法,希望你们给我指点指点思路,在此表示非常的感谢!
#include<stdlib.h> #include<stdio.h> #define N 5 main() { int a[N][N],*p; void change(int *p); printf("source array:\n"); randomize(); for(p=*a;p<*a+N*N;p++) { if((p-*a)%N==0)printf("\n"); printf("%4d",*p=rand()%100); } p=&a[0][0]; change(p); printf("\nnow array: \n"); for(p=*a;p<*a+N*N;p++) { if((p-*a)%N==0)printf("\n"); printf("%4d",*p); } getch(); }
void change(int *p) { int i,j,temp; int *pmax,*pmin; pmax=p; pmin=p; for(i=0;i<N;i++) for(j=0;j<N;j++) { if(*pmax<*(p+N*i+j)) pmax=p+N*i+j; if(*pmin>*(p+N*i+j)) pmin=p+N*i+j; } temp=*(p+12);*(p+12)=*pmax;*pmax=temp; temp=*p;*p=*pmin;*pmin=temp; pmin=p+1; for(i=0;i<N;i++) for(j=0;j<N;j++) if(((p+N*i+j)!=p)&&(*pmin>*(p+N*i+j))) pmin=p+N*i+j; temp=*pmin;*pmin=*(p+4);*(p+4)=temp; pmin=p+1; for(i=0;i<N;i++) for(j=0;j<N;j++) if(((p+N*i+j)!=(p+4))&&((p+N*i+j)!=p)&&(*pmin>*(p+N*i+j))) pmin=p+N*i+j; temp=*pmin;*pmin=*(p+20);*(p+20)=temp; pmin=p+1; for(i=0;i<N;i++) for(j=0;j<N;j++) if(((p+N*i+j)!=p)&&((p+N*i+j)!=(p+4))&&((p+N*i+j)!=(p+20))&&(*pmin>*(p+N*i+j))) pmin=p+N*i+j; temp=*pmin;*pmin=*(p+24);*(p+24)=temp; }