点击查看代码
//解决矩阵中填数的题目思路(可解决99%题目)
//1.定义方向变量, 右,下,左,上(移动方向)
// int dx[] = {0, 1, 0, -1};
// int dy[] = {1, 0, -1, 0};
//2.根据规则结合方向向量填数
// 1/ 朝一个方向走,一边走一边填数,直到越界
// 2/ 越界之后,结合方向向量,重新计算出新的坐标以及方向
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 15;
// 方向向量:右(0,1)、下(1,0)、左(0,-1)、上(-1,0)
int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};
int arr[N][N];
int main(){
int n;
cin >> n;
int x = 1, y = 1;
int pos = 0;
for(int i = 1; i <= n * n; i++){
arr[x][y] = i; // 填充当前位置为数字i
// 计算下一个位置
int a = x + dx[pos], b = y + dy[pos];
// 判断下一个位置是否越界,或是否已填充(非0)
if(a > n || a < 1 || b > n || b < 1 || arr[a][b] != 0){
pos = (pos + 1) % 4;// 切换方向(右→下→左→上循环)
a = x + dx[pos], b = y + dy[pos];// 切换方向后重新计算下一个位置
}
// 更新当前位置为下一个位置
x = a, y = b;
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
printf("%3d", arr[i][j]);
}
printf("\n");
}
return 0;
}