例5.13 蛇形填数
在n*n方阵里填入1,2,3,…,n*n,要求填成蛇形。例如n=4时方阵为:
10 11
12 1
9 16 13 2
8 15 14 3
7
6
5 4
上面的方阵中,多余的空格只是为了便于观察规律,不必严格输出,n<=8。
【分析】:
类比数学中的矩阵,我们可以用一个所谓的二维数组来储存题目中的方阵。只需声明一个int
a[MAXN][MAXN],就可以获得一个大小为MAXN×MAXN的方阵。在声明时,两维的大小不必相同,因此也可以声明int
a[30][50]这样的数组,第一维下标范围是0,1,2,…,29,第二维下标范围是0,1,2,…,49。
让我们从1开始依次填写。设“笔”的坐标为(x,y),则一开始x=0,y=n-1,即第0行,第n-1列(别忘了行列的范围是0到n-1,没有第n列)。“笔”的移动轨迹是:下,下,下,左,左,左,上,上,上,右,右,下,下,左,上。总之,先是下,到不能填了为止,然后是左,接着是上,最后是右。“不能填”是指再走就出界(例如4→5),或者再走就要走到以前填过的格子(例如12→13)。如果我们把所有格子初始为0,就能很方便地加以判断。
【代码】
#include
#include
using namespace std;
int a[100][100];
int n,m,i,j,x,y,k,tot;
int main()
{
cin>>n;
k=n*n;
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
a[i][j]=0;
tot=1;
a[0][n-1]=1;x=0;y=n-1;
while (tot
{
while((x+1
while((y-1>=0)&&(!a[x][y-1]))
{y-=1;tot+=1;a[x][y]=tot; }
while((x-1>=0)&&(!a[x-1][y]))
{x-=1;tot+=1;a[x][y]=tot; }
while((y+1
}
for(i=0;i<=n-1;i++)
{
for(j=0;j<=n-1;j++)
cout<<setw(5)<<a[i][j];
cout<<endl;
}
}
加载中,请稍候......