求解n阶螺旋矩阵问题

[问题描述] 创建n阶螺旋矩阵并输出。

[输入描述] 输入包含多个测试用例,每个测试用例为一行,包含一个正整数n(1 <= n <= 50)以输入0表示结束

[输出描述] 每个测试用例输出n行,每行包括n个整数,整数之间用一个空格分隔.

[输入样例] 4

​ 0

[样例输出] 1 2 3 4

​ 12 13 14 5

​ 11 16 15 6

​ 10 9 8 7

[思路] 采用递归方法求解,设f(x,y,start,n)用于创建左上角(x,y) 起始元素值为start的阶螺旋矩阵,共n行n列,它是大问题;则f(x+1,y+1,start,n-2)用于创建左上角为(x+1,y+1)、起始元素值为start的n-2阶螺旋矩阵,共n-2行n-2列,它是小问题。
在这里插入图片描述

对应的递归模型如下:

f(x,y,start,n) = 不做任何事情 当n <= 0时

f(x,y,start,n) = 产生只有一个元素的螺旋矩阵 当n = 1时

f(x,y,start,n) = 产生(x,y)的那一圈;f(x+1,y+1,start,n-2)

[完整程序]

#include <iostream>
using namespace std;
#define MAXN 51 
//问题表示
int n;
//求解结果表示
int s[MAXN][MAXN];//存放螺旋矩阵
void Spiral(int x,int y,start,n)//递归创建螺旋矩阵
{
    int i,j;
    if(n <= 0)
    {
        return;
    }
    if(n == 1)
    {
        s[x][y] = start;
        return;
    }
    for(i = x;i < x + n - 1;i++)//上一行
    {
        s[y][i] = start++;
    }
    for(j = y;j < y + n - 1;j++)//右一列
    {
        s[j][x + n - 1] = start++;
    }
    for(i = x + n - 1;i > x;i--)//下一行
    {
        s[y + n - 1][i] = start++;
    }
    for(j = y + n - 1;j > y;j--)//左一列
    {
        s[j][x] = start++;
    }
    Spiral(x+1,y+1,start,n-2);//递归调用
}
void dispMatrix()//输出螺旋矩阵
{
    for(i = 0;i < n;i++)
    {
        for(int j = 0;j < n;j++)
        {
            cout << s[i][j] << "\t";
        }
        cout << endl;
    }
}
int main()
{
    while(true)
    {
        cin >> n;
        if(n == 0)
        {
            break;
            Spiral(0,0,1,n);
            dispMatrix();
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃掉你的脑子·

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值