BASIC-25VIP试题 回形取数

来源:互联网 发布:捷克 语言 知乎 编辑:程序博客网 时间:2024/05/17 23:48
/*
问题描述
  回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入格式
  输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
输出格式
  输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
样例输入
3 3    
1 2 3    
4 5 6     
7 8 9     
样例输出
1 4 7 8 9 6 3 2 5  
样例输入
3 2
1 2     
3 4      
5 6      
样例输出
1 3 5 6 4 2

*/

#include <stdio.h>

void shuru(  int  , int n , int [][n] );
void hxqs(  int  , int n , int [][n] );

int main(void)
{
    int  m , n ;
    scanf("%d%d",&m , &n );
    int s[m][n];
    shuru(m , n, s);
    hxqs(m , n , s );
    return 0;
}

void shuru( int m , int n , int s[][n] )
{
    int i , j ;
    for( i = 0 ;i < m ; i ++)
    {
        for( j = 0 ; j < n ; j ++)
        {
            scanf("%d", &s[i][j]);
        }
    }
}

void hxqs( int m , int n , int  s[][n])
{
    int hx = 0 ;  //计算 个数
    int x= -1 , y = 0 ; // 会回型位置
    
    while(hx < m * n)  
    {
        while(x + 1 < m &&s[x + 1][y] != -1)   // 竖直向下
        {
            printf("%d ", s[++x][y]);  
            s[x][y] = -1;  
            hx ++;  
        }  
        while(y + 1 < n && s[x][y + 1] != -1) // 左
        {  
            printf("%d ", s[x][++y]);  
            s[x][y] = -1;
            hx ++;
        }  
        while(x - 1 >= 0 && s[x - 1][y] != -1)   //上
        {  
            printf("%d ", s[--x][y]);  
            s[x][y] = -1;  
            hx ++;  
        }  
        while(y - 1 >= 0 && s[x][y - 1] != -1) //  右
        {  
            printf("%d ", s[x][--y]);  
            s[x][y] = -1;  
            hx ++;  
        }
    }        
}

原创粉丝点击