1
#include<bits/stdc++.h>
using namespace std;
//在n*n方阵里填入1,2,3,…,n*n,要求填成蛇形。
#define N 1000
int a[N][N];
int main()
{
int n;
cin >> n ;
int x=0,y=n-1,num=0;
a[x][y] = ++num;
while(num<n*n)
{
while(x<n-1&&!a[x+1][y])
{
a[++x][y]=++num;
}
while(y>=1&&!a[x][y-1])
{
a[x][--y]=++num;
}
while(x>0&&!a[x-1][y])
{
a[--x][y]=++num;
}
while(y<n-1&&!a[x][y+1])
{
a[x][++y]=++num;
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
printf("%5d", a[i][j]);
}
printf("\n");
}
return 0;
}
2
#include<bits/stdc++.h>
//1 2 3 4 5
//12 13 14 6
//11 15 7
//10 8
//9
using namespace std;
#define N 1000
int a[N][N];
int main()
{
int n,num;
int s=0;
cin >> n;
num=n * (n + 1) / 2;
int x=0,y=0;
a[0][0]=++s;
while(s<num)
{
while(y<n-1&&!a[x][y+1])
a[x][++y]=++s;
while(x<n-1&&!a[x+1][y-1])
a[++x][--y]=++s;
while(x>0&&!a[x-1][y])
a[--x][y]=++s;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(a[i][j]==0) break;
else printf("%5d", a[i][j]);
}
printf("\n");
}
return 0;
}
3
#include<bits/stdc++.h>
using namespace std;
//我的思路是,这个蛇形填数的每行和每列都是有一定的规律,这个规律就体现在他们相邻数之间的差值k,利用这个道理,可以仿照蛇形填数1来进行填数
#define N 1000
int a[N][N];
int main()
{
int n;
cin >> n;
int x=0,y=0;
int k=2;
int num=1;
a[0][0]=1;
while(num<n*n)
{
while(y<n-1&&!a[x][y+1])//右移填数
{
a[x][++y]=a[x][y]+k;
k++;
num++;
}
k=k-1;
while(x<n-1&&!a[x+1][y])//下移
{
k--;
a[++x][y]=a[x][y]+k;
num++;
}
while(y>0&&!a[x][y-1])//左移
{
k++;
a[x][--y]=a[x][y]-k;
num++;
}
while(x>0&&!a[x-1][y])//上移
{
k--;
a[--x][y]=a[x][y]-k;
num++;
}
k=k+1;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
printf("%5d", a[i][j]);
}
printf("\n");
printf("\n");
}
return 0;
}