P5731 【深基5.习6】蛇形方阵 - 洛谷 | 计算机科学教育新生态
我们只要定义两个方向向量数组,这种问题就可以迎刃而解了
比如我们是4的话,我们从左向右开始存,1,2,3,4 到5的时候y就大于4了就是越界了,这时候我们换成向下的方向,也就是用第二个方向向量继续往下走,也就是增加x,继续存5,6,7,接下来x又越界了,接下来继续向左存8,9,10 然后向上存11,12 向右存13,14,向下存15,向左存16
#include <iostream>
#include <cstring>
using namespace std;
const int N = 19;
int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};
int ret[N][N];
int main()
{
int n;
cin >> n;
int cnt = 1;
int x = 1,y = 1;
int pos = 0;
int a,b;
while(cnt <= n*n)
{
ret[x][y] = cnt;
a = x+dx[pos];b = y+dy[pos];
if(a>n || b>n || a<1 || b<1 || ret[a][b])
{
pos = (pos+1)%4;
a = x+dx[pos];b=y+dy[pos];
}
x = a;y = b;
cnt++;
}
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=n;j++)
{
printf("%3d",ret[i][j]);
}
puts("");
}
return 0;
}