【OI】蛇形填数题的深入探究
题目:在 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】蛇形填数题的深入探究的更多相关文章
- ACM 蛇形填数
蛇形填数 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 在n*n方陈里填入1,2,...,n*n,要求填成蛇形.例如n=4时方陈为:10 11 12 19 16 1 ...
- nyoj 33 蛇形填数
蛇形填数 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 在n*n方陈里填入1,2,...,n*n,要求填成蛇形.例如n=4时方陈为: 10 11 ...
- <蛇形填数>--算法竞赛 入门经典(第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 ...
- ny33 蛇形填数
蛇形填数 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 在n*n方陈里填入1,2,...,n*n,要求填成蛇形.例如n=4时方陈为: 10 11 12 1 9 16 1 ...
- 【ACM】蛇形填数 - 逻辑怪
蛇形填数 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 在n*n方陈里填入1,2,...,n*n,要求填成蛇形.例如n=4时方陈为:10 11 12 19 16 1 ...
- 梦工厂实验室 蛇形填数 dfs
问题 D: 蛇形填数 时间限制: 3 Sec 内存限制: 64 MB提交: 28 解决: 5[提交][状态][讨论版] 题目描述 在n*n方阵里填入1,2,...,n*n,要求填成蛇形.例如n=4 ...
- nyoj_33_蛇形填数_201308221636
蛇形填数时间限制:3000 ms | 内存限制:65535 KB 难度:3描述 在n*n方陈里填入1,2,...,n*n,要求填成蛇形.例如n=4时方陈为:10 11 12 19 16 13 28 ...
- nyoj33 蛇形填数
蛇形填数 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描写叙述 在n*n方陈里填入1,2,...,n*n,要求填成蛇形.比如n=4时方陈为: 10 11 12 1 9 16 ...
- [C++]蛇形填数
[从左下角开始,逆时针蛇形填数] #include <iostream> using namespace std; int main() { int n; cin>>n; in ...
随机推荐
- .net core 响应的json数据驼峰显示问题。
在.net core webapi中,默认响应的json数据是以驼峰显示的,即首字母小写的方式.如果让其正常显示,只需要在全局配置即可.代码如下图: 配置之后,响应数据就不会再以驼峰的形式展示了.而是 ...
- Qt开发Gif播放器
一.资源下载地址 https://www.aliyundrive.com/s/jBU2wBS8poH 本项目路径:项目->免费->Gif播放器(包含整个工程源码,vs2019打开即可编译运 ...
- 【XSS-labs】level 6-10
Level 6 查看源码:对URL中的传参进行了HTML实体化转义,搜索框中的值对 src\onxxxxx\data\href进行了限制. 采用大小写绕过,在搜索框输入payload,注意闭合inpu ...
- 搭建riscv环境
1.第一步 clone 需要的源文件(sudo apt install git 如果你没有git) 以下都是给予ubuntu18.04 $ git clone --recursive https ...
- NOIP 模拟 $19\; \rm v$
题解 一道概率与期望的状压题目 这种最优性的题目,我们一般都是倒着转移,因为它的选择是随机的所以我们无法判断从左还是从右更有,所以我们都搜一遍 时间一定会爆,采用记忆化搜索,一种状态的答案一定是固定的 ...
- Mybatis-Plus入门学习笔记(一)
本文内容 了解Mybatis-Plus 整合Mybatis-Plus 1.了解Mybatis-plus 1.1.Mybatis-Plus介绍 MyBatis-Plus(简称 MP)是一个 MyBati ...
- docker部署minio
快速部署 docker run -p 9000:9000 --name myminio \ -e "MINIO_ACCESS_KEY=AKIAIOSFODNN7EXAMPLE" \ ...
- 字符串拷贝函数递归与非递归的C语言实现
初学递归的时候,觉得很抽象,不好分析,确实如此,尤其是有些时候控制语句不对,导致程序进去无限次的调用,更严重的是栈溢出.既要正确的控制结束语句,又要有正确的进入下次递归的语句,还要有些操作语句.... ...
- 分布式链路追踪系统Sleuth和ZipKin
1.微服务下的链路追踪讲解和重要性 简介:讲解什么是分布式链路追踪系统,及使用好处 进行日志埋点,各微服务追踪. 2.SpringCloud的链路追踪组件Sleuth 1.官方文档 http://cl ...
- kettle 查询 tinyint 值为 Y,kettle 查询 tinyint 为布尔值
问题解决方法 1.在数据库连接中的[选项]命令参数中加入:tinyInt1isBit = false,如下图: 实际场景: