<蛇形填数>--算法竞赛 入门经典(第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 。
类比上面这种数学中的矩阵,我们可以考虑使用一个二维数组来储存。
解题思路:从右上角开始往下填数,当到底的时候转向左填值,当到左边的边的时候转向上填数,当到最上面的时候转向右填值...依次类推。第一轮转圈的判断条件很简单,就是当横坐标小于行数、纵坐标小于列数的时候。但是这样循环下去当到第二轮循环的时候就会把第一轮的数值覆盖,即一直在最外面的一圈循环下去(当把数值填够之后停止)。我们可以这样解决这个问题:起始把数组置成0,然后在判断转向的时候加上&&非下一个位置上的值即可。
以下是具体解题的代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 4
using namespace std;
int a[maxn][maxn]; int main() {
int i, j;
/*
for(i = 0; i < maxn; i++) {
for(j = 0; j < maxn; j++)
a[i][j] = 0;
}*/
memset (a,,sizeof(a));//这是cstring中的函数,当然也可以用上面的方法赋值
a[][maxn-] = ;
j = maxn-;
i = ;
int count = ;///从1开始填数 /*---------思考下面为什么是错误的???
while(count < maxn*maxn)
{
while(i+1 < maxn && !a[++i][j]) a[i][j] = ++count;
while(j-1 >= 0 && !a[i][--j]) a[i][j] = ++count;
while(i-1 >= 0 && !a[--i][j]) a[i][j] = ++count;
while(j+1 < maxn && !a[i][++j]) a[i][j] = ++count;
}*/ while(count < maxn*maxn)//①
{
while(i+ < maxn && !a[i+][j]) a[++i][j] = ++count;//②
while(j- >= && !a[i][j-]) a[i][--j] = ++count;
while(i- >= && !a[i-][j]) a[--i][j] = ++count;
while(j+ < maxn && !a[i][j+]) a[i][++j] = ++count;
}
for(i = ; i < maxn; i++)//输出
{
for(j = ; j < maxn; j++)
printf("%3d",a[i][j]);
cout << endl;
}
return ;
}
有兴趣的码友可以考虑一下:
1、①处为什么不是 count <= maxn*maxn ;
2、②处为什么不是 count++ ;
3、②处可不可以改成 while(i+1 < maxn && !a[++i][j]) a[i+1][j] = ++count ;
欢迎码友评论,谢谢支持。
<蛇形填数>--算法竞赛 入门经典(第2版)- 3.1 数组 程序3-3 蛇形填数的更多相关文章
- [刷题]算法竞赛入门经典(第2版) 5-13/UVa822 - Queue and A
题意:模拟客服MM,一共有N种话题,每个客服MM支持处理其中的i个(i < N),处理的话题还有优先级.为了简化流程方便出题,设每个话题都是每隔m分钟来咨询一次.现知道每个话题前来咨询的时间.间 ...
- [刷题]算法竞赛入门经典(第2版) 5-10/UVa1597 - Searching the Web
题意:不难理解,照搬题意的解法. 代码:(Accepted,0.190s) //UVa1597 - Searching the Web //#define _XIENAOBAN_ #include&l ...
- [刷题]算法竞赛入门经典(第2版) 5-7/UVa12100 - Printer Queue
题意:一堆文件但只有一个打印机,按优先级与排队顺序进行打印.也就是在一个可以插队的的队列里,问你何时可以打印到.至于这个插队啊,题目说"Of course, those annoying t ...
- [刷题]算法竞赛入门经典(第2版) 5-1/UVa1593 - Alignment of Code
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa1593 - Alignment of Code #include&l ...
- [刷题]算法竞赛入门经典(第2版) 4-10/UVa815 - Flooded!
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa815 - Flooded! #include<iostream ...
- [刷题]算法竞赛入门经典(第2版) 4-8/UVa12108 - Extraordinarily Tired Students
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa12108 - Extraordinarily Tired Stude ...
- [刷题]算法竞赛入门经典(第2版) 4-7/UVa509 - RAID!
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa509 - RAID! #include<iostream> ...
- [刷题]算法竞赛入门经典(第2版) 4-6/UVa508 - Morse Mismatches
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,10 ms) //UVa508 - Morse Mismatches #include< ...
- [刷题]算法竞赛入门经典(第2版) 4-5/UVa1590 - IP Networks
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa1590 - IP Networks #include<iost ...
随机推荐
- VirtualBox安装CentOS6.4(32bit)
实验环境 Win7 64bit 目的: 实验VirtualBox安装CentOS6.4(32bit) 下载VirtualBox 地址: http://www.oracle.com/technetwor ...
- ice 有道德的黑客!
ice 有道德的黑客! 在开始正文之前,请帮忙为当前 排名前 10 唯一的 .Net 开源软件 FineUI 投一票: 投票地址: https://code.csdn.net/2013OSSurve ...
- 详解android的号码匹配
什么是号码匹配,个人理解,即判断两组号码是否属于同一个号码.在实际使用过程中,接触到的号码会涉及到区号,国家编码以及IP号码等,这个时候就用到了号码匹配.两个内容不一样的号码,如+86***和1795 ...
- html标签详解,html标签属性大全(完美版),包括css属性详解
这个是平时放在笔记里,需要什么了,查下当字典用,想不起来了就查下,个人在用有道云,查询框一输就找到了.下篇会把我整理手机的html5发了.引用在某处常看到的话.楼主耗时费心整理··请拿走······· ...
- css透明度(兼容所有浏览器)
.transparent{ background: rgba(, , , 0.3) !important; /* IE无效,FF有效 */ filter: alpha(opacity=); -moz- ...
- C#Redis列表List
一.前戏 在Redis中,List类型是按照插入顺序排序的字符串链表.和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素.在插入时,如果该键并不存在,Redis将 ...
- Redmine数据库备份及搬家
Bitnami Redmine的备份分2种方式: 1.导出数据库 2.整个目录搬家 不管是哪种都想停掉服务,redmine相关的服务有以下5个: redmineApache redmineMySQL ...
- flexbox应用举例
我们常说的"flexbox"其实包含"父元素","子元素"2个部分,将"父元素"定义为一个flexbox,则在" ...
- 第11章:DOM扩展
- Python 根据地址获取经纬度
方法一: 使用Geopy包 : https://github.com/geopy/geopy (仅能精确到城镇,具体街道无结果返回) from geopy.geocoders import Nom ...