关于45度遍历二维数组的一点记录
2016-01-04 16:09
295 查看
主要用到扫描行的思想
![](http://img.blog.csdn.net/20160104154435272)
红色虚线即代表扫描行
在对二维数组进行赋值时,二维数组的纵坐标是由X和扫描行之间的一些关系得到,而这个关系则控制了该倾斜遍历究竟是以下图中的哪一种
![](http://img.blog.csdn.net/20160104155103764)
需要注意的是扫描行的区间在于0 ~ 2 * 宽度 - 1(在此讨论的是长宽相等的二维数组,但其实即使长宽不等,只要改变数据就行了,思路是一样的)
另外需要注意的是,因为扫描行的区间位于0 ~ 2 * 宽度 - 1,因此在遍历过程中会出现得出的纵坐标不在0~宽度这个范围内,那么就需要加上一个约束条件
具体请看代码,只要合理的改变X的起、止以及横纵坐标的调换就能得到几乎所有方向的二维数组的遍历
红色虚线即代表扫描行
在对二维数组进行赋值时,二维数组的纵坐标是由X和扫描行之间的一些关系得到,而这个关系则控制了该倾斜遍历究竟是以下图中的哪一种
需要注意的是扫描行的区间在于0 ~ 2 * 宽度 - 1(在此讨论的是长宽相等的二维数组,但其实即使长宽不等,只要改变数据就行了,思路是一样的)
另外需要注意的是,因为扫描行的区间位于0 ~ 2 * 宽度 - 1,因此在遍历过程中会出现得出的纵坐标不在0~宽度这个范围内,那么就需要加上一个约束条件
具体请看代码,只要合理的改变X的起、止以及横纵坐标的调换就能得到几乎所有方向的二维数组的遍历
[code]// // main.cpp // test // // Created by BppleMan‘s Mac on 16/1/3. // Copyright © 2016年 BppleMan's Mac. All rights reserved. // #include <iostream> #define SIZE 3 //SIZE来控制数组宽度 using namespace std; const int S = 20; //数组的容器大小 int a[S][S]; //一个输出函数 void display() { int i,j; for (i = 0; i < SIZE; i++) { for (j = 0; j < SIZE; j++) { cout<<a[i][j]<<" "; } cout<<endl; } cout<<endl; } int main(int argc, const char * argv[]) { int x,y,count = 1; /* 1 3 6 2 5 8 4 7 9 */ //2 * SIZE - 1就是扫描行的最大行数 for (y = 0; y < 2 * SIZE - 1; y++) { for (x = 0; x < SIZE; x++) { //控制纵坐标的范围是0~SIZE if(y - x >= 0 && y - x < SIZE) //通过找规律的到y与x的关系以此确定纵坐标 a[y - x][x] = count++; } } display(); /* 1 2 4 3 5 7 6 8 9 */ count = 1; for (y = 0; y < 2 * SIZE - 1; y++) { for (x = 0; x < SIZE; x++) { if(y - x >= 0 && y - x < SIZE) a[x][y - x] = count++; } } display(); /* 4 2 1 7 5 3 9 8 6 */ count = 1; for (y = 0; y < 2 * SIZE - 1; y++) { for (x = 0; x < SIZE; x++) { if(x+y-(SIZE-1) >= 0 && x+y-(SIZE-1) < SIZE) a[x+y-(SIZE-1)][x] = count++; } } display(); /* 6 3 1 8 5 2 9 7 4 */ count = 1; for (y = 0; y < 2 * SIZE - 1; y++) { for (x = SIZE-1; x >= 0; x--) { if(x+y-(SIZE-1) >= 0 && x+y-(SIZE-1) < SIZE) a[x+y-(SIZE-1)][x] = count++; } } display(); /* 6 8 9 3 5 7 1 2 4 */ count = 1; for (y = 0; y < 2 * SIZE - 1; y++) { for (x = SIZE-1; x >= 0; x--) { if(x+y-(SIZE-1) >= 0 && x+y-(SIZE-1) < SIZE) a[x][x+y-(SIZE-1)] = count++; } } display(); /* 4 7 9 2 5 8 1 3 6 */ count = 1; for (y = 0; y < 2 * SIZE - 1; y++) { for (x = 0; x < SIZE; x++) { if(x+y-(SIZE-1) >= 0 && x+y-(SIZE-1) < SIZE) a[x][x+y-(SIZE-1)] = count++; } } display(); return 0; }
相关文章推荐
- R语言学习笔记
- linux(centos) 保存退出vi编辑
- Python将unicode编码字符串转化为中文
- 归档解档
- 配置linux服务器的防火墙,以CENTOS 为例(转载)
- webapi中使用Route标签
- 控制台直接输入阿拉伯数字自动翻译成相应的英文星期
- Android编程操作嵌入式关系型SQLite数据库实例详解
- Application Transport Security has blocked a cleartext HTTP (http://) 解决方案
- 【源码分析】极验验证官方SDK源码分析和实现思路
- cJSON代码阅读(7)——解析JSON数组
- web.xml 配置中classpath: 与classpath*:的区别
- 创建 ASP.NET Web API的Help Page
- Fastjson简单使用方法
- Veeam Backup & Replication 8 同步与恢复
- javascript从定义到执行 你不知道的那些事
- 今天我回来了
- Laravel5.1教程 前言
- 基于jquery封装的一个简单web右键菜单
- 猜数字游戏的提示