题目:在 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)。

解:

 1 #include <stdio.h>
2 #include <string.h>
3
4 #define maxn 20
5 int a[maxn][maxn];
6
7 int main ()
8 {
9 int n , x , y , tot = 0;
10 scanf("%d",&n);
11 memset(a,0,sizeof(a));
12 tot = a[x = 0][y = n-1] = 1;
13
14 while (tot < n*n)
15 {
16 while (x+1<n && !a[x+1][y]) a[++x][y] = ++tot;
17 while (y-1>=0 && !a[x][y-1]) a[x][--y] = ++ tot;
18 while (x-1>=0 && !a[x-1][y]) a[--x][y] = ++tot;
19 while (y+1<n && !a[x][y+1]) a[x][++y] = ++tot;
20
21 }
22
23 for (x = 0;x < n;x++)
24 {
25 for (y = 0;y < n;y++)
26 {
27 printf("%3d",a[x][y]);  //输出和例题一样的格式
28 }
29 printf("\n");
30 }
31
32 return 0;
33 }

下面对一些细节进行探究:

  一、二维数组的数学抽象

    由于我们无法控制鼠标的位置,我们只能通过平面的坐标系来定位每一个数的位置,在顺次输出几个。这就涉及到了平面坐标系在C语言中的抽象,很显然的,我们使用二维数组。

   

    每一个格子就是一个坐标,这样抽象的好处是我们无需考虑其如何输出,只需要考虑我们如何赋值即可。

    另外的一个技巧是:将整个数组初始化为0,这样0就代表是该坐标位置未被占去的状态,可以用!a[x][y}是否为1来判断。并且,无论格子内填了什么,!a[x][y]的值都会是0。

  二、简化运算符的使用

    就像书上说的一样,

    tot = a[x = 0][y = n-1] = 1;

    这句话包含了很大的信息量。不仅使得代码变得简洁,而且没有使程序的易读性丧失。

  三、短路运算符的妙用

    当你不能避免某一条语句会导致下标溢出的时候,使用短路运算符可以很好的解决问题。就比如将!a[x+1][y]放入&&的后面,即使x+1>=n也不会使得下标溢出。

  四、细节问题

    注意观察变量的情况。如果tot的初始值为1,那么下面的句子就要使用tot++。

来自:《算法竞赛入门经典》--紫皮书

【OI】蛇形填数题的深入探究的更多相关文章

  1. ACM 蛇形填数

    蛇形填数 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 在n*n方陈里填入1,2,...,n*n,要求填成蛇形.例如n=4时方陈为:10 11 12 19 16 1 ...

  2. nyoj 33 蛇形填数

    蛇形填数 时间限制:3000 ms  |            内存限制:65535 KB 难度:3   描述 在n*n方陈里填入1,2,...,n*n,要求填成蛇形.例如n=4时方陈为: 10 11 ...

  3. <蛇形填数>--算法竞赛 入门经典(第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   ...

  4. ny33 蛇形填数

    蛇形填数 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 在n*n方陈里填入1,2,...,n*n,要求填成蛇形.例如n=4时方陈为: 10 11 12 1 9 16 1 ...

  5. 【ACM】蛇形填数 - 逻辑怪

    蛇形填数 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 在n*n方陈里填入1,2,...,n*n,要求填成蛇形.例如n=4时方陈为:10 11 12 19 16 1 ...

  6. 梦工厂实验室 蛇形填数 dfs

    问题 D: 蛇形填数 时间限制: 3 Sec  内存限制: 64 MB提交: 28  解决: 5[提交][状态][讨论版] 题目描述 在n*n方阵里填入1,2,...,n*n,要求填成蛇形.例如n=4 ...

  7. nyoj_33_蛇形填数_201308221636

    蛇形填数时间限制:3000 ms  |  内存限制:65535 KB 难度:3描述 在n*n方陈里填入1,2,...,n*n,要求填成蛇形.例如n=4时方陈为:10 11 12 19 16 13 28 ...

  8. nyoj33 蛇形填数

    蛇形填数 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描写叙述 在n*n方陈里填入1,2,...,n*n,要求填成蛇形.比如n=4时方陈为: 10 11 12 1 9 16 ...

  9. [C++]蛇形填数

    [从左下角开始,逆时针蛇形填数] #include <iostream> using namespace std; int main() { int n; cin>>n; in ...

随机推荐

  1. 刚学spark

    https://blog.csdn.net/u013019431/article/details/80776662   在jupyter notebook import pysparkhttps:// ...

  2. Python - typing 模块 —— Any Type

    前言 typing 是在 python 3.5 才有的模块 前置学习 Python 类型提示:https://www.cnblogs.com/poloyy/p/15145380.html 常用类型提示 ...

  3. F与Q查询 事务 choices参数

    F与Q查询 F查询 当我们需要将两个字段对应的数据进行比较时就需要用到F查询. select * from book where sold > stock 1.例如需要将售出部分数据和库存数据进 ...

  4. JavaScript(Node.js)+ Selenium 实现淘宝抢单

    JavaScript(Node.js)+ Selenium 淘宝抢单 为了买买买我也是拼了,看了一点selenium的资料,随便写的. 程序写的比较烂,但是够我自己用了,望各路大牛指教. 使用说明: ...

  5. 记录一次java项目上线部署

    环境 操作系统:CentOS Linux release 8.0.1905 数据库:mariadb10.3.17 安装数据库 yum install -y mariadb mariadb-server ...

  6. Socket通信协议解析(文章摘要)

    参考网址: https://zhuanlan.zhihu.com/p/84800923 在计算机通信领域,socket 被翻译为"套接字",它是计算机之间进行通信的一种约定或一种方 ...

  7. wpf 滚动文字 跑马灯

    有时候也会有用,比如我的软件界面 放不下全长的文字时.或者状态栏显示一些时间,地点,温度,湿度等等这些东西 代码链接  https://gitee.com/csszbb/wpfnet5 这属于WPF ...

  8. Linux命令:ps -ef |grep java

    一.ps -ef |grep java 查看包含"java"的所有进程 二.涉及命令详解 ps命令将某个进程显示出来(是LINUX下最常用的也是非常强大的进程查看命令) grep命 ...

  9. ffplay 播放网络摄像头视频

    shell脚本如下,无须加port ffplay rtsp://cameral_ip

  10. Learning ROS: Managing System dependencies

    Download and install the system dependencies for turtlesim: roscd turtlesim cat package.xml rosdep i ...