PTA题目 7-13 漂亮的螺旋(Python和C++实现)

题目展示

出这种题的脑子被驴踢了

摆个样例让我猜输出格式是什么

控制输出格式这一块

发个文章诅咒你。。

首先说Python如何解决该问题

第一步先进行初始化



n = int(input())

dx = [0,1,0,-1]
dy = [-1,0,1,0]
"""
dx,dy控制搜索方向,你写成元组也可以,喜欢哪个写哪个
"""

dl = []
for i in range(1,1000):
    dl.append(i)
    dl.append(i)
"""
通过样例可以看出,数字是从中心按照逆时针方向递增
递增步数为1,1,2,2......n , n, n+1, n+1
预处理行进步数,方便后续操作
"""
tot = 1

pos = 0
r = 0
sx,sy = n//2-1,n//2+(n&1^1)
"""
初始坐标和搜索用的容器
"""

a = [[0]*100 for _ in range(100)]
"""
存储答案
"""

第二步写搜索函数,实现从中心逆时针往外的递归

def dfs(x,y):
    global tot,pos,r
"""
global更改用来对下标的容器
不用global写在函数里面也行
"""
    if x<0 or x>=n or y<0 or y>=n:
        return
"""
控制边界
"""
    for _ in range(dl[pos]):
        a[x][y]=tot
        tot+=1
        x+=dx[r]
        y+=dy[r]
"""
遍历当前边,逆时针给矩阵填空
"""
    r+=1
    r%=4
    pos+=1
    dfs(x,y)
"""
拐弯
"""

第三步开始递归

a[sx][sy]=tot
tot=1
sy-=1
"""
第一个点先填上
"""
dfs(sx,sy)

第四步打印答案,控制输出

outs = ["" for _ in range(n)]
for i in range(n):
    sz = 0
    for j in range(n):
        outs[j]+=str(a[j][i])
        sz = max(sz, len(str(a[j][i])))
    for j in range(n):
        if i+1!=n:
            outs[j]+=" "*(4-len(str(a[j][i])))
"""
这个" "*(4-len(str(a[j][i])))
本题最大亮点,如果题目上告诉你宽度控制在4上99%的人一遍就能过
你就不用
一遍一遍输出
猜这个宽度是多少了

"""
print('\n'.join(outs))

以上是Python实现方案,总代码如下

n = int(input())
dx = [0,1,0,-1]
dy = [-1,0,1,0]
dl = []
for i in range(1,1000):
    dl.append(i)
    dl.append(i)
tot = 1
pos = 0
r = 0
sx,sy = n//2-1,n//2+(n&1^1)
a = [[0]*100 for _ in range(100)]
def dfs(x,y):
    global tot,pos,r
    if x<0 or x>=n or y<0 or y>=n:
        return
    for _ in range(dl[pos]):
        a[x][y]=tot
        tot+=1
        x+=dx[r]
        y+=dy[r]
    r+=1
    r%=4
    pos+=1
    dfs(x,y)
a[sx][sy]=tot
tot=1
sy-=1
dfs(sx,sy)
outs = ["" for _ in range(n)]
for i in range(n):
    sz = 0
    for j in range(n):
        outs[j]+=str(a[j][i])
        sz = max(sz, len(str(a[j][i])))
    for j in range(n):
        if i+1!=n:
            # outs[j]+="  "
            outs[j]+=" "*(4-len(str(a[j][i])))
print('\n'.join(outs))

下面是C++的写法,不用递归了,直接进行模拟

#include <bits/stdc++.h>
int main()
{
    int n;
    std::cin >> n;
    std::vector a(n + 1, std::vector<int>(n + 1));
    int T = n * n;
    int px{n}, py{n}, dl = {n - 1};
    while (T > 0)
    {
        int pos;
        for (pos = 0; pos < dl; py--)
        {
            a[px][py] = T--;
            pos++;
        }
        for (pos = 0; pos < dl; px--)
        {
            a[px][py] = T--;
            pos++;
        }
        for (pos = 0; pos < dl; py++)
        {
            a[px][py] = T--;
            pos++;
        }
        for (pos = 0; pos < dl; px++)
        {
            a[px][py] = T--;
            pos++;
        }
        dl -= 2, px--, py--;
    }
    for (px = 1; px <= n; px++)
    {
        for (py = 1; py <= n; py++)
            if (py == n)
                printf("%-d", a[px][py]);
            else
                printf("%-4d", a[px][py]);
        std::cout << '\n';
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值