题目:在 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. Notepad++的NppFTP插件连接linux操作系统

    Notepad++的NppFTP插件连接linux操作系统 下载地址:https://notepad-plus-plus.org/downloads/v8.1.2/ 1.安装Npp_FTP插件 两种方 ...

  2. 腾讯云TDSQL MySQL版 - 开发指南 二级分区

    TDSQL MySQL版 目前支持 Range 和 List 两种格式的二级分区,具体建表语法和 MySQL 分区语法类似. 二级分区语法 一级 Hash,二级 List 分区示例如下: MySQL ...

  3. mysql几种连接方式区别

    mysql的几种join 2017年03月19日 14:49:07 carl-zhao 阅读数:7845 标签: mysqlsqljoin 更多 个人分类: MySQL 版权声明:本文为博主原创文章, ...

  4. Vue实现在前端导出Excel 方法2

    也可以去看下我的方法1:https://www.cnblogs.com/yingyigongzi/p/10915382.html ----------------------------------- ...

  5. Javascript - Vue - 动画

    动画状态类名 vue动画通过将需要执行动画的标签放入transition标签中,再通过设置预置的vue动画类名的css样式来控制动画的呈现效果. 开场动画状态的三个类名 v-enter:动画开始之前的 ...

  6. restore db fail

    System.Data.SqlClient.SqlError: The operating system returned the error '5(Access is denied.)' while ...

  7. Java中除数为0的情况

    转自http://blog.csdn.net/alanzyy/article/details/8591534 在数学中,规定被除数不能为0 那么在Java程序中一旦出现除数为0时,会出现什么情况呢: ...

  8. opencv入门系列教学(四)处理鼠标事件

    一.鼠标事件的简单演示 opencv中的鼠标事件,值得是任何与鼠标相关的任何事物,例如左键按下,左键按下,左键双击等.我们先来看看鼠标事件有哪些,在python中执行下面代码: import cv2 ...

  9. java和js中for循环的区别

    java中for循环,先执行语句后循环 for (int i=1;i<10;i++){ for(int b=1;b<=i;b++){ System.out.print(b+"*& ...

  10. Go初始化二维数组

    初始化二维数组 var a = make([][]int, n) for i := 0; i < n; i++ { a[i] = make([]int, n) }