蓝桥杯——螺旋矩阵

一道校赛的题,题目忘了,但大概意思就是,输入 举证的行、列数,构造螺旋矩阵:

 

思路就是构造一个二维数组,然后全部填0,做为 螺旋填数时的碰壁判断

填数是从 1 到 x * y,所以外面套一个while循环,当填的数 < x*y 时,不断循环

里面主要构成是4个循环,分别负责,从左到右,从上到下,从右到左,从下到上的四条边的填数

其中,向单一方向进行移动的同时,不断的判断继续往该方向移动时的下一位是否已经填过数【非0】,未填过数,就不断循环填数,直到填过数,结束这个方向的边的填充循环

每次移动后,可以发现要填的数num,坐标 i j 可能会额外加减1,所以直接加个if判断,修正相关数据

#include<stdio.h>
#include<string.h>

int a[100][100];

int main(){
    int x,y;
    memset(a,0,sizeof(a));
    scanf("%d %d",&x,&y);
    int num = 0;
    int i = 1, j = 0;
    int re = x*y;//   x行   y列
    while(num < re){
        while(j <= y && !a[i][j+1]){
            a[i][++j] = ++num;
        }
        if(j > y)
        {
            j--;num--;
        }
        while(i <= x && !a[i+1][j]){
            a[++i][j] = ++num;
        }
        if(i > x)
        {
            i--;num--;
        }
        while(j >= 1 && !a[i][j-1]){
            a[i][--j] = ++num;
        }
        if(j < 1){
            j++;num--;
        }
        while(i >= 1 && !a[i-1][j]){
            a[--i][j] = ++num;
        }
    }


    //print
    for( i = 1;i <= x;i++){
        for(j = 1;j <=y;j++)
            printf("%d ",a[i][j]);
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/expedition/p/12207215.html