码迷,mamicode.com
首页 > 编程语言 > 详细

<蛇形填数>--算法竞赛 入门经典(第2版) 程序3-3 蛇形填数

时间:2016-07-24 14:49:48      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:

蛇形填数: 在n×n方阵里填入1,2,....,n×n,要求填成蛇形。例如,n = 4 时方阵为:

      10  11  12  1

      9  16  13  2

      8  15  14  3

      7   6   5  4 

    上面的方阵中,多余的空格只是为了便于观察规律,不必严格输出。<= 8 

    类比上面这种数学中的矩阵,我们可以考虑使用一个二维数组来储存。

   解题思路:从右上角开始往下填数,当到底的时候转向左填值,当到左边的边的时候转向上填数,当到最上面的时候转向右填值...依次类推。第一轮转圈的判断条件很简单,就是当横坐标小于行数、纵坐标小于列数的时候。但是这样循环下去当到第二轮循环的时候就会把第一轮的数值覆盖,即一直在最外面的一圈循环下去(当把数值填够之后停止)。我们可以这样解决这个问题:起始把数组置成零,然后在判断转向的时候加上&&非下一个位置上的值即可。

    以下是具体解题的代码:

 1 #include <stdio.h>
 2 #define maxn 8
 3 int a[maxn][maxn];
 4 int main()
 5 {
 6     int i, j;
 7     for(i = 0; i < maxn; i++)
 8     {
 9         for(j = 0; j <  maxn; j++)
10             a[i][j] = 0;
11     }
12     a[0][maxn-1] = 1;
13     j = maxn-1;
14     i = 0;
15     int count = 1;/*---------思考下面为什么是错误的???
16     while(count < maxn*maxn)
17     {
18         while(i+1 < maxn && !a[++i][j]) a[i][j] = ++count;
19         while(j-1 >= 0 && !a[i][--j]) a[i][j] = ++count;
20         while(i-1 >= 0 && !a[--i][j]) a[i][j] = ++count;
21         while(j+1 < maxn && !a[i][++j]) a[i][j] = ++count;
22     }*/////初学者最容易犯的错误:忽略i++和i+1是不一样的!
23     while(count < maxn*maxn)  //①
24     {
25         while(i+1 < maxn && !a[i+1][j]) a[++i][j] = ++count;  //②
26         while(j-1 >= 0 && !a[i][j-1]) a[i][--j] = ++count;
27         while(i-1 >= 0 && !a[i-1][j]) a[--i][j] = ++count;
28         while(j+1 < maxn && !a[i][j+1]) a[i][++j] = ++count;
29     }
30     for(i = 0; i < maxn; i++)
31     {
32         for(j = 0; j < maxn; j++)
33             printf("%3d ",a[i][j]);
34         printf("\n");
35     }
36     return 0;
37 }

    有兴趣的码友可以考虑一下:

     1、①处为什么不是count <= maxn*maxn ;

     2、②处为什么

1 #include <stdio.h>
 2 #define maxn 8
 3 int a[maxn][maxn];
 4 int main()
 5 {
 6     int i, j;
 7     for(i = 0; i < maxn; i++)
 8     {
 9         for(j = 0; j <  maxn; j++)
10             a[i][j] = 0;
11     }
12     a[0][maxn-1] = 1;
13     j = maxn-1;
14     i = 0;
15     int count = 1;/*---------思考下面为什么是错误的???
16     while(count < maxn*maxn)
17     {
18         while(i+1 < maxn && !a[++i][j]) a[i][j] = ++count;
19         while(j-1 >= 0 && !a[i][--j]) a[i][j] = ++count;
20         while(i-1 >= 0 && !a[--i][j]) a[i][j] = ++count;
21         while(j+1 < maxn && !a[i][++j]) a[i][j] = ++count;
22     }*/////初学者最容易犯的错误:忽略i++和i+1是不一样的!
23     while(count < maxn*maxn)  //①
24     {
25         while(i+1 < maxn && !a[i+1][j]) a[++i][j] = ++count;  //②
26         while(j-1 >= 0 && !a[i][j-1]) a[i][--j] = ++count;
27         while(i-1 >= 0 && !a[i-1][j]) a[--i][j] = ++count;
28         while(j+1 < maxn && !a[i][j+1]) a[i][++j] = ++count;
29     }
30     for(i = 0; i < maxn; i++)
31     {
32         for(j = 0; j < maxn; j++)
33             printf("%3d ",a[i][j]);
34         printf("\n");
35     }
36     return 0;
37 }

 

  

不是 count++ ;

     3、②处可不可以改成 while(i+1 < maxn && !a[i++][j]) a[i][j] = ++count ;

  欢迎码友评论,谢谢支持。

<蛇形填数>--算法竞赛 入门经典(第2版) 程序3-3 蛇形填数

标签:

原文地址:http://www.cnblogs.com/Ddlm2wxm/p/5700713.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!