回 帖 发 新 帖 刷新版面

主题:[讨论]一个简单的题目,望大家来改正!

习题描述:
将一个5*5的矩阵中最大的元素放在中心,四个角分别放四个最小的元素(顺序从左到右,从上到下顺序依次从小到大存放),写一个函数实现之。用main函数调用。
例如原来矩阵:
35 34 33 32 31
30 29 28 27 26
25 24 23 22 21
20 19 18 17 16
15 14 13 12 11

改变后的矩阵
11 34 33 32 12
30 29 28 27 26
25 24 35 22 21
20 19 18 17 16
13 23 15 31 14



我自己写的答案:


#include<stdio.h>
void exchange(int (*a)[5])
{
    int i,i1,i2,j,j1,j2,max=0,min1=a[0][0];
    int min2,min3,min4;
    for(i=0;i<5;i++)
        for(j=0;j<5;j++)
        {
            if(a[i][j]>max)
            {
                max=a[i][j];
                i1=i;j1=j;    
            }
            if(a[i][j]<min1)
            {
                min1=a[i][j];
                i2=i;j2=j;
            }
        }
            a[i1][j1]=a[2][2];
            a[2][2]=max;
            a[i2][j2]=a[0][0];
            a[0][0]=min1;
            min2=max;
            min3=max;
            min4=max;
    for(i=0;i<5;i++)
        for(j=0;j<5;j++)
            if(a[i][j]<min2&&a[i][j]>a[0][0])
            {
                min2=a[i][j];
                i1=i;j1=j;
            }
            a[i1][j1]=a[0][4];
            a[0][4]=min2;
    for(i=0;i<5;i++)
        for(j=0;j<5;j++)
            if(a[i][j]<min3&&a[i][j]>a[0][4])
            {
                min3=a[i][j];
                i1=i;j1=j;
            }
            a[i1][j1]=a[4][0];
            a[4][0]=min3;
    for(i=0;i<5;i++)
        for(j=0;j<5;j++)
            if(a[i][j]<min4&&a[i][j]>a[4][0])
            {
                min4=a[i][j];
                i1=i;j1=j;
            }
            a[i1][j1]=a[4][4];
            a[4][4]=min4;
}
main()
{   int i,j;
    int a[5][5]={35,34,33,32,31,
                30,29,28,27,26,
               25,24,23,22,21,
               20,19,18,17,16,
               15,14,13,12,11};
        exchange(a);
        for(i=0;i<5;i++)
        {
            for(j=0;j<5;j++)
                printf("%5d",a[i][j]);
            printf("\n");
        }
  

}

希望高手们能贴出优秀的代码,让大家学习啊!

回复列表 (共2个回复)

沙发

显得很长 循环次数很多 
思路很直白

板凳


把函数的形参int(*p)改为int a[]即可。我以前也写过类似的。你把N改一下就可以了应该。

#include<stdio.h>
void change(int*p,int);
#include<stdlib.h>
#include<time.h>
#define N 15
void main()
{
    srand((unsigned)time(NULL));
    int a[N][N],i,j,*p;
    for(i=0;i<N;i++)
        for(j=0;j<N;j++)
            a[i][j]=rand()%100;
    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
            printf("%3d",a[i][j]);
         printf("\n");
    }
    printf("\n");
p=a[0];
change(p,N);
    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
            printf("%3d",a[i][j]);
         printf("\n");
    }
    printf("\n");
}
void change(int*p,int n)
{
    int*min=p,*max=p,i,j,temp;
    for(i=0;i<N;i++)
        for(j=0;j<N;j++)
            if(*(p+n*i+j)>*max)
                max=p+n*i+j;
            else if(*(p+n*i+j)<*min)
                min=p+n*i+j;
    if(*max!=*(p+int(n*n/2)))
    {
        temp=*(p+int(n*n/2));
        *(p+int(n*n/2))=*max;
        *max=temp;
    }
    if(*min!=*p)
    {
        temp=*p;
        *p=*min;
        *min=temp;
    }
    min=p+n-1;
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            if((*(p+n*i+j)<*min)&&((p+n*i+j)!=p))
                min=p+n*i+j;
    if(*min!=*(p+n-1))
    {
                temp=*(p+n-1);
                *(p+n-1)=*min;
                *min=temp;
    }
    min=p+n*(n-1);
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            if((*(p+n*i+j)<*min)&&(*(p+n*i+j)!=*p)&&(*(p+n*i+j)!=*(p+n-1)))
                min=p+n*i+j;
    if(*min!=*(p+n*(n-1)))
    {
        temp=*(p+n*(n-1));
        *(p+n*(n-1))=*min;
        *min=temp;
    }
    min=p+n*n-1;
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            if((*(p+n*i+j)<*min)&&(*(p+n*i+j)!=*p)&&(*(p+n*i+j)!=*(p+n-1))&&(*(p+n*i+j)!=*(p+n*(n-1))))
                 min=p+n*i+j;
    if(*min!=*(p+n*n-1))
    {
        temp=*(p+n*n-1);
        *(p+n*n-1)=*min;
        *min=temp;
    }
}
            

我来回复

您尚未登录,请登录后再回复。点此登录或注册