【算法】蓝桥杯 基础练习 回形取数

试题 基础练习 回形取数

资源限制
时间限制:1.0s   内存限制:512.0MB
问题描述
  回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转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 anticlockwise(int A[][200], int m, int n);
int main()
{
    int m,n,i,j;
    int A[200][200];
    scanf("%d %d",&m,&n);
    for(i=0; i<m; i++)
    {
        for(j=0; j<n; j++)
        {
            scanf("%d",&A[i][j]);
        }
    }
    anticlockwise(A,m,n);
    return 0;
 } 
 
void anticlockwise(int A[][200],int m,int n)//注意二维数组传参的问题,可以给列先设定一个可以满足的最大,这样比较方便 
{
    //先初始化左上角和右下角的坐标
    int leftUphang=0,leftUplie=0,rightDownhang=m-1,rightDownlie=n-1;
//    int h=leftUphang,l=leftUplie;//复制一遍,为了使初始的左上角左边不变,因为在循环的时候,到内层了就不是和0在比较,而是在和左上角那个点在比较,所以需要复制一遍 
    //最后一步要进行的就是循环,可以知道通过左上角不断的向下,右上角的行列++,会有重复的时候,所以会在打印出了一圈之后将左上的--,右下的++
    while(leftUphang<=rightDownhang &&leftUplie<=rightDownlie) 
    {
        int l=leftUplie;
        int h=leftUphang;//新一轮的循环记得将新的左上角赋值给l和j ,所以放在里面 
        
        //既然是逆时针
        //先输出左边的一列,列不变,行++
        while(h<=rightDownhang)
        {    
            printf("%d ",A[h++][l]);
        }
        //再输出下面的一排,行不变,列++
        //行恢复
         h=rightDownhang;
        //列向右移动
        if(n==1)
        {
            return;
        }
        l++;
        while(l<=rightDownlie)
        {
            printf("%d ",A[h][l++]);
         } 
        //再输出右边的一列,列不变,行++ 
        //恢复
        l=rightDownlie;
        //行--
        h--;
        if(m==1){
            return;
        }
        while(h>=leftUphang) 
        {
            printf("%d ",A[h--][l]);
        }
        //最后输出上边的一排,行不变,列--
        //恢复
        h=leftUphang;
        //列移动
        l--; 
        while(l>leftUplie)
        {
            printf("%d ",A[h][l--]);
        }
        leftUphang++;
        leftUplie++;
        rightDownhang--;
        rightDownlie--; 
    }
}

以上代码,大致思路是对的,只不过对于特定是一些情况的时候仍然需要讨论一下才行,比如只有一行,或者只有一列的情况就需要设置退出条件

posted @ 2020-03-03 08:42  美好事物  阅读(684)  评论(0编辑  收藏  举报