之前参加一个校内实验室考核时,有一道题是蛇形螺旋填数,只不过要求用python实现。
当时一脸懵逼的尝试,结果也没做出来。
谁知,在刘汝佳的《算法竞赛入门经典》里竟有几乎原题,只不过初始position不同罢了,用c语言实现的。
今天看书看到了这里,就试着用c++做了一遍,position选的是(0,0)即左上角。原理还是刘老师的思路,顺序改为--右--下--左--上。
我的代码是这样的:
#include<iostream>
#include<cstring>//因为要用memset函数快速方便地将a数组初始化。
using namespace std;
#define maxn 20
int a[maxn][maxn];
int main()
{
int n;
cin>>n;
memset(a,0,sizeof(a));//将数组a的初值赋值为0,表示还没被填数
int x=0,y=0,tot=1;//x,y是坐标,tot是从1开始要依次填入的数
a[0][0]=1;//起点值当然是1咯
while(tot<n*n){
while((y+1<n)&&(a[x][y+1]==0))//不越界,未被填过就一直往右走,依次填数
a[x][++y]=++tot;
while((x+1<n)&&(a[x+1][y]==0))//向下
a[++x][y]=++tot;
while((y-1>=0)&&(a[x][y-1]==0))//向左
a[x][--y]=++tot;
while((x-1>=0)&&(a[x-1][y]==0))//向上
a[--x][y]=++tot;
}
for(int i =0;i<n;i++){
for(int j=0;j<n;j++)
printf("%4d",a[i][j]);//遍历输出
cout<<endl;
}
return 0;
}
其实这道题还是蛮需要琢磨的,有很多细节,比如++tot而不是tot++;c语言的短路特性,先判断再做处理比做完反悔更好等等。
记下。