c++反向螺旋矩阵问题,求输出结果

【题目描述】
如下为规模为4的螺旋矩阵:
1 12 11 10
2 13 16 9
3 14 15 8
4 5 6 7
求规模为n(n<=15)(注意:每个元素需要4个位,也就是要用%4d)
【输入格式】
输入一个整数n
【输出格式】
输出规模为n的螺旋矩阵。
样例输入
4
样例输出
1 12 11 10
2 13 16 9
3 14 15 8
4 5 6 7


#include <stdio.h>
#include <iostream>
using namespace std;

int dir[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
//下,右,上,左

int a[100][100];

int n;
int k = 2;
int i = 0;

void dfs(int x, int y)
{
    if (k > n * n)
        return;

    while (1)
    {
        int nx = x + dir[i][0];
        int ny = y + dir[i][1];
        if (0 <= nx && nx < n && 0 <= ny && ny < n && a[nx][ny] == 0)
        {
            a[nx][ny] = k;
            k++;
            dfs(nx, ny);
            break;
        }
        else
        {
            i = (i + 1) % 4;
        }
    }
}

int main()
{
    scanf("%d", &n);
    a[0][0] = 1;
    dfs(0, 0);
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            printf("%4d", a[i][j]);
        }
        cout << endl;
    }
    return 0;
}

参考这个改改

#include
using namespace std;

const int nmax = 50;
int a[nmax][nmax];//定义一个二维数组来装数字后直接打印
int n;//参数n


/*
思路:通过分析可知“创建n阶螺旋矩阵并输出”当n>2以后可以用递归分为两部分来实现,一个是外层的实现,一个是内层的递归
参数:
    1,n 
    2,num0 用来确定输出的数字
    3,len 用来表示当前调用的是哪个递归
    4, m 用来确定输出坐标
*/
void HelixMatrix(int n, int num0, int len, int m) {
    
    if (len == 1) {
        a[m][m] = num0;
        return;
    }
    if (len == 2) {
        a[m][m] = num0++;
        a[m][m + 1] = num0++;
        a[m + 1][m + 1] = num0++;
        a[m + 1][m] = num0;
        return;

    }

    int x = m;//坐标最小值
    int y = n + 1 - m;//坐标最大值(第一层的时候是n,第二层是n-1,第三层是n-2.......
    int tmp = num0;//不要随便改变传入参数的值
    
    if (len >= 3) {
        //上面
        for (int i = x; i <= y; i++) {
            a[x][i] = tmp;
            tmp++;
        }
        //右边
        for (int i = x + 1; i <= y; i++) {
            a[i][y] = tmp;
            tmp++;
        }
        //下面
        for (int i = y - 1; i >= x; i--) {
            a[y][i] = tmp;
            tmp++;
        }
        //左边
        for (int i = y - 1; i >= x + 1; i--) {
            a[i][x] = tmp;
            tmp++;
        }
        HelixMatrix(n, tmp, len-2, m+1);
    }
}


int main()
{
    while (1) {
        cin >> n;//输入n

        if (n == 0) {//输入0结束
            printf("请输入有效值\n");
            break;
        }

        //调用函数
        HelixMatrix(n, 1, n, 1);
        
        //打印
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= n; j++)
            {
                printf("%5d", a[i][j]);            //输出右对齐
            }
            cout << endl;
        }
        printf("\n");
    }
    system("pause");
    return 0;
}