加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

例5.13  蛇形填数

(2016-01-08 09:30:58)
标签:

c学习

分类: c 程序进阶

例5.13  蛇形填数

     在n*n方阵里填入1,2,3,…,n*n,要求填成蛇形。例如n=4时方阵为:

    10  11  12  1

     16  13  2

     15  14  3

     7     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;

     }

}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有