一本通 2045 蛇形填数

#include<iostream>
using namespace std;
int a[21][21]={};
int main()
{
int n;
cin>>n;
int x=1,y=n,cnt=1;
a[x][y]=cnt; //最右上角 填写数字 1
while (cnt<n*n)
{
//从上到下 x +1 y 不变,测试下一个元素是否为 0 且 x+1<=n
while( x+1<=n && a[x+1][y]==0 ){
x++;
cnt++;
a[x][y]=cnt;
}
//从右到左 y-1 x 不变
while( y-1>=1 && a[x][y-1]==0 ){
y--;
cnt++;
a[x][y]=cnt;
}
//从下到上 x -1 y 不变
while( x-1>=1 && a[x-1][y]==0 ){
x--;
cnt++;
a[x][y]=cnt;
}
//从左到右 y +1 x 不变
while( y+1<=n && a[x][y+1]==0 ){
y++;
cnt++;
a[x][y]=cnt;
}
}
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++) cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}