矩阵特殊数字排列

orer.h

/*****************************************************************************
*         FileName : order.h
*         Date : 2005/03/08
*         Author : Liuzhimao
*         Module :
*         Description :
*
*         Copyright (c) 2005 Neusoft Co. Ltd. All Rights Reserved.
*-----------------------------------------------------------------------------
*                                   Edit History
*   NO      Date                Modifier                Modified Content
*   1         2005/03/08    troy                         Basic definition
*
*****************************************************************************/

#ifndef         _ORDER_H
#define        _ORDER_H


/*****************************************************************************
*                                            Marco Definition                                                    *
*****************************************************************************/

#define M 5


/*****************************************************************************
*                                            Function Definition                                                *
*****************************************************************************/
void InputData( int Matrix[M][M] );
void OutputData( int Matrix[M][M] );
void Swap( int Matrix[M][M],                          /* 输入存放的二维数组 */ 
                     int value,                                    /* 要交换的最小值和最大值 */
                     int pos,                                       /* 在二维数组中的交换位置 */
                     int tmpTable[M*M],                   /* 一维临时数组,用于判断交换位置是否可用 */
                     int max                                       /* 输入值中的最大值 */
                     );
void Order(int Matrix[M][M]);

#endif

order.c

/********************************************************************************
*   将一个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                                                                                         *
*********************************************************************************/


/*****************************************************************************
* FileName     :  Order.c
* Date              :  2005/03/08
* Author           :  troy
* Module          : 
* Description  : 
*
*   Copyright (c) 2005 Neusoft Co. Ltd. All Rights Reserved.
*-----------------------------------------------------------------------------
*                                       Edit History
*   NO      Date                  Modifier              Modified Content
*   1          2005/03/08      troy                      Basic definition 
*   2          2005/09/10      troy                       修正了格式,以及一个bug                           
*****************************************************************************/
/*****************************************************************************
*                                  Included header file(s)                                                   *
*****************************************************************************/
#include <stdio.h>
#include <string.h>
#include "order.h"

/****************************************************************************
* Function Name      : InputData
* Description             : Input data into Matrix
* Input Parameters   : Matrix[M][M]
* Output Parameters: Matrix[M][M] 
* Return Value           : None
* Caller                        : 
* Date                          : 2005/03/08
* Author                       : troy
*****************************************************************************/
void InputData( int Matrix[M][M] )
{
         int           i,j;                   
 /* 循环计数 */

         printf( "/nPlease input data:/n" );

         for(i=0; i<M; i++)
        {
                for(j=0; j<M; j++)
                {
                         scanf( "%d", &(Matrix[i][j]) );
                }
        }
 

        printf( "/nThe matrix you input is:/n" );
}


/****************************************************************************
* Function Name       : OutputData
* Description              : Output Matrix to screen
* Input Parameters   : Matrix[M][M]
* Output Parameters: Matrix[M][M] 
* Return Value           : None
* Caller                        : 
* Date                          : 2005/03/08
* Author                       : troy
*****************************************************************************/
void OutputData( int Matrix[M][M] )
{
          int  i,j;  /* 循环计数 */ 

          for( i=0; i<M; i++ )
          {
                   for(j=0; j<M; j++)
                  {
                             printf( "%-2d  ", Matrix[i][j] );
                   }
                  printf("/n");
          }
}

/*****************************************************************************
* Function Name            : Swap
* Description                   : Program entry
* Input Parameters         : Matrix[M][M]          输入存放的二维数组
                                              value                    要交换的最小值和最大值
                                              pos                       在二维数组中的交换位置
                                              tmpTable[M*M]    一维临时数组,用于判断交换位置是否可用
                                              max                       输入值中的最大值
* Output Parameters       : Matrix[M][M]
                                               tmpTable[M*M] 
* Return Value                   : None
* Caller                                : 
* Date                                  : 2005/03/08
* Author                               :   troy
*****************************************************************************/
void Swap(
                    int Matrix[M][M],                             /* 输入存放的二维数组 */
                    int value,                                       /* 要交换的最小值和最大值 */
                    int pos,                                          /* 在二维数组中的交换位置 */
                    int tmpTable[M*M],                      /* 一维临时数组,用于判断交换位置是否可用 */
                    int max                                          /* 输入值中的最大值 */
                    )
{
         int  tmp;                       /* 数据交换时的临时变量 */
         int  i,j;                          
/* 循环计数 */

        /* 用找出的值与原表相应的位置进行交换 */
         for (i = 0;i < M;i++)
         {
                 for (j = 0;j < M;j++)
                  {
                             if( value == Matrix[i][j] && 0 == tmpTable[i*M + j] )
                              {
                                             tmp = Matrix[pos/M][pos%M];
                                             Matrix[pos/M][pos%M] = value;
                                             Matrix[i][j] = tmp;

                                             if(Matrix[i][j] != max)
                                             {
                                                            tmpTable[i*5+j] = 1;
                                             }
                                             else
                                             {
                                                             tmpTable[i*5+j] = 0;
                                             }

                                             tmpTable[pos] = 1;

                                             return;
                               }
  
                  }
        }
}


/*****************************************************************************
* Function Name  : order
* Description   : Program entry
* Input Parameters : Matrix[M][M]
* Output Parameters: Matrix[M][M] 
* Return Value  : None
* Caller    : 
* Date    : 2005/03/08
* Author    : troy
*****************************************************************************/
void Order(int Matrix[M][M])
{
           int       tmpTable[M*M];         /* 将二维数组变换成一维时的存储 */
           int       i,j;                                 /* 循环计数 */ 
           int       tmp;                             /* 查找交换时的临时变量 */
           int       temp[5];                     
 /* 存储4个最小值和一个最大值 */

           /* 将原表复制到一维数组中 */
           for(i = 0; i < M; i++)
           {
                   for(j = 0; j < M; j++)
                   {
                             tmpTable[i*M + j] = Matrix[i][j];
                   }
            }

             /* 找出最大值,起泡到一维数组的最后 */
            for(i = 0; i < M*M -1; i++)
            {
                        if(tmpTable[i] > tmpTable[i + 1])
                        {
                                         tmp    = tmpTable[i];
                                         tmpTable[i]  = tmpTable[i + 1];
                                         tmpTable[i + 1] = tmp;
                         }
             }
 
             /* 找出4个最小值,依次放到一维数组最前面四个数据域 */
             for(i = 0; i < 4; i++)
             {
                        for(j = i + 1; j < M*M; j++)
                        {
                                      if(tmpTable[i] > tmpTable[j])
                                      {
                                                 tmp   = tmpTable[i];
                                                 tmpTable[i] = tmpTable[j];
                                                 tmpTable[j] = tmp;
                                        }
                          }
              }

              /* 将4个最小值和一个最大值存入临时数组temp中 */
             {
                           temp[0] = tmpTable[0];
                           temp[1] = tmpTable[1];
                           temp[2] = tmpTable[2];
                           temp[3] = tmpTable[3];
                           temp[4] = tmpTable[M*M-1];
              }

              for(i = 0; i < M*M; i++)
              {
                        tmpTable[i] = 0;
             
 }

              /* 进行5轮位置交换 */
              {
                         Swap( Matrix,temp[0],0,tmpTable,temp[4] );
 
                          Swap( Matrix,temp[1],M-1,tmpTable,temp[4] );
 
                          Swap( Matrix,temp[2],M*M-M,tmpTable,temp[4] );
 
                          Swap( Matrix,temp[3],M*M-1,tmpTable,temp[4] );
 
                          Swap( Matrix,temp[4],(M*M-1)/2,tmpTable,temp[4] );
               }

               /* 输出交换后的Matrix表 */
              printf("/nYou result is:/n");

              OutputData( Matrix );
}

/*****************************************************************************
* Function Name  : main
* Description   : Program entry
* Input Parameters : None
* Output Parameters: None 
* Return Value  : None
* Caller    : 
* Date    : 2005/03/08
* Author    : troy
*****************************************************************************/
void main()
{
 
           int  Matrix[M][M];           /* 存储输入的5*5数组 */ 

           InputData( Matrix );
 
           OutputData( Matrix );

           Order( Matrix );
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值