⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 luoxuan_shiyan.cpp

📁 螺旋矩阵的相关实验代码及报告 , 有相关的资料也有以最简单的方式直观实现的代码 .
💻 CPP
字号:
# include <stdio.h>
# include <stdlib.h>

/*  以下为方向设定 */

# define DIR_RIGHT  0     
# define DIR_DOWN   1
# define DIR_LEFT   2
# define DIR_UP     3
# define DIR_MODE   4 


/*     参数说明
 *     N , 螺旋方阵的最大阶数
 *     n , 映射子矩阵的阶数 
 *     n_s , 递归遍历螺旋矩阵时,当前计数的值 
 *     arr , 映射矩阵 
 *     row_s , 本次遍历 , 映射矩阵的开始行
 *     col_s , 本次遍历 , 映射矩阵的开始列
 *     无返回值 , 递归遍历 
*/
void SortArr( int N , int n , int n_s , int ** arr , int row_s , int col_s );


void PrintArr( int n , int ** arr );

int main( int argc , char * argv[] )
{
    int N ;  /*  螺旋方阵的阶数*/
    int ** arr ; /*  映射矩阵  */
    printf("Input(N必须大于0)  N=");
    scanf("%d",&N);
        
    /*  为映射矩阵的存储分配空间  */    
    arr = (int **)malloc(N*sizeof(int *));
    for( int i = 0 ; i < N ; i++ )
    {
         arr[i] = (int *)malloc(N*sizeof(int));
    }  
    
    /*  为映射矩阵的存储分配空间  */      
    for( int i = 0 ; i < N ; i++ )
       for( int j = 0 ; j < N ; j++ )
           arr[i][j] = 0 ;
    
    /*  递归遍历螺旋方阵填充映射矩阵  */      
    SortArr( N , N , 1 , arr , 0 , 0 );  
    
    /*  打印映射矩阵  */  
    PrintArr( N , arr );
    
    system("pause");  
    return 0 ;
}


void SortArr( int N , int n , int n_s , int ** arr , int row_s , int col_s )  //  围绕递归解法 , 从 0 , 0 开始
{
    if( n_s > N*N ) return ;   

    int row = row_s ;
    int col = col_s ;
    int c = n_s ;

    col = col - 1 ;    
    for( int i = 0 ; i < n ; i++ )    //  从子矩阵的第1行开始向右遍历 
    {
         col = col + 1 ;         
         arr[row][col] = c ;
         if( c >= N*N ) return ;   // 当前值大于螺旋矩阵的最大值,则跳出 
         c = c + 1 ;
    }
    
    for( int i = 0 ; i < n-1 ; i++ )   //  从子矩阵的最右列第2行开始向下遍历 
    {
         row = row + 1 ;         
         arr[row][col] = c ;
         if( c >= N*N ) return ;         
         c = c + 1 ;
    }

    for( int i = 0 ; i < n-1 ; i++ )   //  从子矩阵的最后一行的右侧开始向左遍历 
    {
         col = col - 1 ;
         arr[row][col] = c ;
         if( c >= N*N ) return ;         
         c = c + 1 ;
    }
    
    for( int i = 0 ; i < n-2 ; i++ )   //  从子矩阵的最左列从下向上遍历 
    {
         row = row - 1 ;
         arr[row][col] = c ;
         if( c >= N*N ) return ;         
         c = c + 1 ;
    }
    
    PrintArr( N , arr );   /*  追踪映射数组的填充情况 */
        
    SortArr( N , n - 2 , c , arr , row  , col + 1 );
} 
    
    

void PrintArr( int n , int ** arr )   //  打印矩阵函数 
{
     printf("****************************************\n");
     for( int i = 0 ; i < n ; i++ )
     {
          for( int j = 0 ; j < n ; j++ )
          {
               printf("    %d" , arr[i][j] );
          }
          printf("\n");
     }
     printf("****************************************\n");
}


                 
            
            
         
          

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -