题解 | #回型矩阵#
回型矩阵
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; }