P5731 【深基5.习6】蛇形方阵
题目描述
给出一个不大于 9 的正整数 n,输出n×n 的蛇形方阵。
从左上角填上 1 开始,顺时针方向依次填入数字,如同样例所示。注意每个数字有都会占用 3 个字符,前面使用空格补齐。
输入格式
无
输出格式
无
输入输出样例
输入 #1复制
4
输出 #1复制
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
题解
我没有用常规的算法做,而是模拟,像是在玩贪吃蛇,一碰到边或是已填充的就转弯
python
n=eval(input())
matrix = [[0 for j in range(n)] for i in range(n)]
x,y=0,0
towards=['y=y+1','x+=1','y-=1','x-=1']
t=0
for i in range(1,n*n+1):
matrix[x][y]=i
exec(towards[t])
if x>n-1 or y>n-1 or matrix[x][y]!=0:
exec(towards[(t+2)%4])
t=(t+1)%4
exec(towards[t])
for i in (matrix):
for j in i:
print(f"{j: >3}",end='')
print()
c++
同样是模拟,这篇是借鉴大佬改的,用了0的布尔值为否的特性来缩短代码量,相当优雅
#include <iostream>
using namespace std;
int a[15][15];
int main() {
int n,k=1,x=1,y=0;
cin>>n;
while (k<=n*n){
while(y<n&&!a[x][y+1])a[x][++y]=k++; //→
while(x<n&&!a[x+1][y])a[++x][y]=k++; //↓
while(y>1&&!a[x][y-1])a[x][--y]=k++; //←
while(x>1&&!a[x-1][y])a[--x][y]=k++; //↑
}
for (int i=1;i<=n;i++){
for (int j=1;j<=n;j++)printf("%3d",a[i][j]);
cout<<endl;
}
return 0;
}