题解 | #回型矩阵#

回型矩阵

https://www.nowcoder.com/practice/36d5dfddc22c4f5b88a5b2a9de7db343

//没必要每次改边界大小,题目单纯为二维数组赋值,在边界内部依据右下左上的优先级给二维数组赋值,因此用四个优先级判断能不能赋值,向右无法再继续赋值就换方向向下赋值,依据优先级不断换方向。
//判断该方向是否能赋值:1、在边界内 2、其期望前进方向的下一个位置未被赋值(未被赋值的判断,该数为0)
#include <stdio.h>

int main() {
    int a = 0;
    int arr[19][19] = { 1,0 };//第一个元素为1,其余均为0.
    scanf("%d", &a);
    int max = a * a;
    int i = 0, j = 0;
    int b = 1;//右下左上的顺序移动,一个方向移动不了了换一个方向
    while (b < max) {
        if (0 == arr[i][j + 1] && j < a) {//右
            while (0 == arr[i][j + 1] && j < a-1) {
                j++;
                b++;
                arr[i][j] = b;
            }
        }
        if (0 == arr[i + 1][j] && j < a && i < a) {//下
            while (0 == arr[i + 1][j] && i < a-1) {
                i++;
                b++;
                arr[i][j] = b;
            }
        }
        if (0 == arr[i][j - 1] && j >= 0 && i >= 0) {//左
            while (0 == arr[i][j - 1] && j > 0) {
                b++;
                j--;
                arr[i][j] = b;
            }
        }
        if (0 == arr[i - 1][j] && j >= 0 && i >= 0) {//上
            while (0 == arr[i - 1][j] && i > 0) {
                i--;
                b++;
                arr[i][j] = b;
            }
        }
    }
    for (int x = 0; x < a; x++) {
        for (int y = 0; y < a; y++) {
            printf("%d ", arr[x][y]);
        }
        printf("\n");
    }
    return 0;
}

全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务