题目展示
出这种题的脑子被驴踢了
摆个样例让我猜输出格式是什么
控制输出格式这一块
发个文章诅咒你。。
首先说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;
}