<蛇形填数>--算法竞赛 入门经典(第2版) 程序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 

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

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

    以下是具体解题的代码:

 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 ;

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

时间: 2024-11-06 03:46:55

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

《算法竞赛入门经典(第二版)》pdf

下载地址:网盘下载 内容简介  · · · · · · <算法竞赛入门经典(第2版)>是一本算法竞赛的入门与提高教材,把C/C++语言.算法和解题有机地结合在一起,淡化理论,注重学习方法和实践技巧.全书内容分为12 章,包括程序设计入门.循环结构程序设计.数组和字符串.函数和递归.C++与STL入门.数据结构基础.暴力求解法.高效算法设计.动态规划初步.数学概念与方法.图论模型与算法.高级专题等内容,覆盖了算法竞赛入门和提高所需的主要知识点,并含有大量例题和习题.书中的代码规范.简洁.易懂,不

算法竞赛入门经典第2版 第1章

学习目标: 熟悉C语言程序的编译和运行 学会编程计算并输出常见的算术表达式的结果 掌握整数和浮点数的含义和输出方法.声明方法.读入方法 掌握数学函数的使用方法 初步了解变量的含义 掌握变量交换的三变量法 理解算法竞赛中的程序三部曲:输入.计算.输出 记住算法竞赛的目标及其对程序的要求 1.2 变量及其输入 1.如果一定要把浮点数值存放在一个int型变量中,将会丢失部分信息--不推荐这样做. 例1-1  圆柱体的表面积 #include <stdio.h> int main() { const

算法竞赛入门经典(第二版) - 第二章 思考题及习题

题目1(必要的储存量) 输入一些数,统计个数.(无需数组) 输入一些数,求最大值.最小值和平均数.(无需数组) 输入一些数,哪两个数最接近.(需要数组) 输入一些数,求第二大的值.(无需数组) 输入一些数,求它们的方差.(需要数组) 输入一些数,统计不超过平均数的个数.(无需数组) 题目2(统计字符1的个数) maxn设置的值过大,系统很可能无法分配如此大的内存. 判断语句应该改为if (s[i] == '1'),1是数值,'1'是字符. 使用string.h头文件的下的strlen函数但未包含

&lt;蛇形填数&gt;--算法竞赛 入门经典(第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 上面的方阵中,多余的空格只是为了便于观察规律,不必严格输出.n <= 8 . 类比上面这种数学中的矩阵,我们可以考虑使用一个二维数组来储存. 解题思路:从右上角开始往下填数,当到底的时候转向左填值,当到左边的边的时候转向上填数,当到最上面的时候转向右填值...依次类推.第一轮转圈

算法竞赛入门经典(第二版)3-3数数字UVA1225

#include <cstdio> #include <string.h> int main(){ int n; scanf("%d", &n); getchar(); while (n--){ char str[10000]; scanf("%s",str) ; int len=strlen(str); int num=0; for(int i=0;i<10;i++) { for(int j=0;j<len;j++) {

算法竞赛入门经典(第二版) - 第一章 习题

习题1-1 平均数(average) 1 #include <stdio.h> 2 int main(void) 3 { 4 int a, b, c; 5 scanf("%d %d %d", &a, &b, &c); 6 printf("%.3f\n", (a + b + c) / 3.0); 7 return 0; 8 } 习题1-2 温度(temperature) 1 #include <stdio.h> 2 in

几何模板总结——算法竞赛入门经典(第二版)

1 #include <iostream> 2 #include <string> 3 #include <cstdio> 4 #include <cstring> 5 #include <cmath> 6 #include <vector> 7 #include <algorithm> 8 9 using namespace std; 10 11 const double PI = acos(-1); 12 13 str

算法竞赛入门经典(第二版) - 第二章 习题

习题2-1 水仙花数(daffodil) 1 #include <stdio.h> 2 int main(void) 3 { 4 for (int i = 1; i < 10; i++) 5 for (int j = 0; j < 10; j++) 6 for (int k = 0; k < 10; k++) 7 if (i*100 + j*10 + k == i*i*i + j*j*j + k*k*k) 8 printf("%d\n", i*100 +

算法竞赛入门经典(第二版)第一章习题

习题1-1 平均数输入3个整数,输出他们的平均值,保留三位小数. #include<stdio.h>int main(){double a,b,c;//必须先定义好要输入的数据类型scanf("%lf%lf%lf",&a,&b,&c);printf("%.3lf",(a+b+c)/3.0);} 习题1-2 温度输入华氏温度f,输出对应的摄氏温度c,保留3位小数.提示c=5(f-32)/9 #include <stdio.h&