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


     蛇形填数: 在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 

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

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

        以下是具体解题的代码:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #define maxn 4
     5 using namespace std;
     6 int a[maxn][maxn];
     7 
     8 int main() {
     9     int i, j;
    10     /*
    11     for(i = 0; i < maxn; i++) {
    12         for(j = 0; j <  maxn; j++)
    13             a[i][j] = 0;
    14     }*/
    15     memset (a,0,sizeof(a));//这是cstring中的函数,当然也可以用上面的方法赋值
    16     a[0][maxn-1] = 1;
    17     j = maxn-1;
    18     i = 0;
    19     int count = 1;///从1开始填数
    20     
    21     /*---------思考下面为什么是错误的???
    22     while(count < maxn*maxn)
    23     {
    24         while(i+1 < maxn && !a[++i][j]) a[i][j] = ++count;
    25         while(j-1 >= 0 && !a[i][--j]) a[i][j] = ++count;
    26         while(i-1 >= 0 && !a[--i][j]) a[i][j] = ++count;
    27         while(j+1 < maxn && !a[i][++j]) a[i][j] = ++count;
    28     }*/
    29 
    30     while(count < maxn*maxn)//
    31     {
    32         while(i+1 < maxn && !a[i+1][j]) a[++i][j] = ++count;//
    33         while(j-1 >= 0 && !a[i][j-1]) a[i][--j] = ++count;
    34         while(i-1 >= 0 && !a[i-1][j]) a[--i][j] = ++count;
    35         while(j+1 < maxn && !a[i][j+1]) a[i][++j] = ++count;
    36     }
    37     for(i = 0; i < maxn; i++)//输出
    38     {
    39         for(j = 0; j < maxn; j++)
    40             printf("%3d",a[i][j]);
    41         cout << endl;
    42     }
    43     return 0;
    44 }
    View Code 

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

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

         2、②处为什么不是 count++ ;

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

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

  • 相关阅读:
    深入浅出计算机组成原理学习笔记:第五十五讲
    深入浅出计算机组成原理学习笔记:第五十四讲
    深入浅出计算机组成原理学习笔记:第五十三讲
    深入浅出计算机组成原理学习笔记:第五十一讲
    深入浅出计算机组成原理学习笔记:第四十九讲
    Linux性能优化实战学习笔记:第三十五讲
    Linux性能优化实战学习笔记:第三十四讲
    Linux性能优化实战学习笔记:第十八讲
    Linux性能优化实战学习笔记:第三十讲
    深入浅出计算机组成原理学习笔记:第五十讲
  • 原文地址:https://www.cnblogs.com/Ddlm2wxm/p/5700845.html
Copyright © 2020-2023  润新知