解决大多数矩阵填数的思路——方向向量

点击查看代码
//解决矩阵中填数的题目思路(可解决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;
}
posted @ 2026-02-23 12:26  无酒无剑  阅读(27)  评论(0)    收藏  举报