题解 | #回型矩阵#
回型矩阵
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;
}
查看13道真题和解析