`
arust
  • 浏览: 93846 次
  • 性别: Icon_minigender_1
  • 来自: 海底
社区版块
存档分类
最新评论

优雅的二维数组循环赋值

    博客分类:
  • lang
阅读更多
最近在 C++ 博客上看到了一段优雅的二维数组赋值代码,学习了一下。
作者为了实现图片中特定效果的二维数组,参考迷宫问题设计了一个优雅的算法,算法的基本思想就是对二维数组按照从外到内的方式赋值,在赋值的过程中加入了对二维数组边界的判断,只需要一层循环就可以实现。整个赋值过程和四冲程发动机工作原理有点类似,循环往复,各种变量之间此消彼长,代码如下:


const int ROW__ = 10;
const int COL__ = 10;
int mat[ROW__][COL__];

struct Position
{
	int nRow;
	int nCol;
};

int main(int argc, char* argv[])
{
	Position offset[4];
	//从左至右,行号不变,列号加一
	offset[0].nRow = 0;
	offset[0].nCol = 1;
	//从上至下,行号加一,列号不变
	offset[1].nRow = 1;
	offset[1].nCol = 0;
	//从右至左,行号不变,列号减一
	offset[2].nRow = 0;
	offset[2].nCol = -1;
	//从下至上,行号减一,列号不变
	offset[3].nRow = -1;
	offset[3].nCol = 0;

	Position curPos;
	curPos.nRow = 0;
	curPos.nCol = 0;
	mat[0][0] = 1;

	int nOffset = 0;

	Position tempPos;
	for (int i = 1; i < ROW__*COL__; i++)
	{
		// nOffset % 4 ------> 右->下->左->上 循环
		tempPos.nRow = curPos.nRow + offset[nOffset % 4].nRow;
		tempPos.nCol = curPos.nCol + offset[nOffset % 4].nCol;

		if (tempPos.nRow >= ROW__ || tempPos.nRow < 0
				|| tempPos.nCol >= COL__ || tempPos.nCol < 0 // 不超过边界
				|| mat[tempPos.nRow][tempPos.nCol] > 0) // 已经有值
		{
			i--;
			nOffset++;
			continue;
		}	

		curPos = tempPos;
		mat[curPos.nRow][curPos.nCol] = i + 1;
	}
	
	return 0;
}
  • 描述: 循环赋值后的结果
  • 大小: 3.7 KB
分享到:
评论

相关推荐

    [Labview]用 for 循环产生 4 行 100 列二维数组,数组成员如下:....

    用 for 循环产生 4 行 100 列二维数组,数组成员如下: 1,2,3………100 100,99,98………..1 6,7,8………….105 105,104,103………6 从这个数组中提取出 2 行 50 列的二维数组,成员如下: 50,49,48……...

    【LabVIEW程序】数组任意位置写入

    此DEMO实现在二维数组的任意位置写入。用到了元素同址替换操作。注意此LabVIEW版本为2018,低版本软件无法打开。

    pb 编写的数组使用方法,希望对初学者有用

    数组使用,含一维、二维数组赋值、调用等使用方法。

    php实现给二维数组中所有一维数组添加值的方法

    给二维数组中所有的一维数组添加值(索引和关联) $shop = array( 0=&gt;array(0=&gt;1,1=&gt;2,2=&gt;3,3=&gt;4) ,1=&gt;array(0=&gt;1,1=&gt;2,2=&gt;3) ,2=&gt;array(0=&gt;1,1=&gt;2,2=&gt;3) ); print_r($shop); //示例 1:引用循环变量的地址赋值 ...

    JAVA中的二维数组

    //方法一:使用嵌套for循环输出二维数组 for(int i=0;i;i++) { for(int j=0;j;j++) { System.out.print(arr[i][j]+" "); } System.out.println(); } //方法二:使用嵌套foreach输出二维数组 ...

    二维数组-易语言

    二维数组 尽可能的让你看到 易语言 版本的变量[0].x[0]=11 变量[1].x[1]=22 这样的形式 在火山pc里是怎么赋值与取值的 注释写的非常详细了 有错误的地方欢迎指正 一起交流学习  大神勿喷

    关于c语言二维数组初始化

    C语言中的二维数组初始化可以通过以下几种...使用循环进行初始化:通过嵌套循环遍历二维数组的每个元素,并为其赋值 使用动态内存分配进行初始化:首先为二维数组的每一行分配内存,然后再为每一行的每个元素分配内存

    matlab N维数组的创建与(循环)赋值(包括三维数组、向量、矩阵区别等等)包含PDF和源码,for循环、初始化等,持续更新中

    本资源讲述了如何在matlab中创建数组并做了非常详细的汇总,包括数组和向量、矩阵、张量的区别,重点是解决matlab中如何创建N维数组以及怎么给他循环赋值等等,非常详细地总结了一系列创建二维数组的方法如eye、rand...

    c语言二维数组初始化.pdf

    C语言中初始化二维数组的方法有多种,以下是其中几种常见的方法: 1. 使用双重循环遍历赋值: 2. 使用静态方式初始化: 3. 使用动态方式初始化: 需要注意的是,在使用静态方式初始化时,如果未指定初始值,数组...

    实验4 数组(4学时)

    以类型int[][]声明一个叫matrix的二维数组变量,将矩阵初始化为一个5个元素的数组。 以下列方式为matrix的内部元素赋值:matrix从零开始循环到其长度值;例如索引为i,在每次迭代中,将matrix[i]指向一个新的整数数...

    c#基础之数组与接口使用示例(遍历数组 二维数组)

    一、初始化数组: 代码如下:string[] s1 = {“aaa”,”bbb”,”ccc”} //直接赋值string[] s2 = new string[5] {“aaa”,”bbb”,”ccc”}; //赋值加指定长度string[] s3 = new string[]{... //声明一个二维数组st

    实验二 方法的定义、重载;数组的应用 定义一个数组,将序列{0,1,2,3,4}赋值给数组,并写一个方法用来访问数据的每一个元素

    3、掌握一维数组的定义。4、掌握如何获取一维数组的最值。5、掌握一维数组中元素的排序。项目3、定义一个数组,将序列{0,1,2,3,4}赋值给数组,并写一个方法用来访问数据的每一个元素。1)定义一个数组,在初始化...

    实验二 方法的定义、重载;数组的应用 定义一个数组,并获取该数组中值最小的元素

    3、掌握一维数组的定义。4、掌握如何获取一维数组的最值。5、掌握一维数组中元素的排序。项目4、定义一个数组,并获取该数组中值最小的元素1)定义一个数组2)定义一个方法,用来获取最小值。该方法应返回一个int型...

    八十多条C语言基础教程

    (31)二维数组应用实例(2) (32)用一维数组来存储字符串 (33)字符串的输入与输出 (34)字符串数组 (35)用于字符串处理的函数 (36)字符串应用实例 (37)传给Main函数的参数 (38)函数指针 (39)函数的递归调用 (40)变量作用...

    指针数组和数组指针的区别.doc

    如要将二维数组赋给一指针,应这样赋值: int a[3][4]; int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++; //该语句执行过后,...

    【03-流程控制与数组】

    顺序结构  •顺序结构就是程序从上到下一行一行地执行,中间没有...三维数组也是一维数组,其数组元素是二维数组;四维数组还是一维数 组,其数组元素是三维数组……从这个角度来看,Java语言里没有多维数组。

    数组程序设计.docx

    掌握一维数组、二维数组的概念及元素的各种表示方法; 2. 正确掌握数组输入输出等的基本操作; 3. 掌握函数访问数组的方法; 4. 字符串的处理方法; 5. 掌握数组中的一些常用算法,并能解决实际问题。 1.3 必做实验...

    VC++基础视频教程100讲

    教程描述:本教程详细介绍了C/C++的相关知识,共100讲,包括最基本的C,C++,VC环境的安装配置及顺序,判断,循环、if与switch条件分支语句、一维数组的概念、二维数组、字符数组(字符串)、函数分类等各类语法,本教程...

    C语言程序设计标准教程

    二维数组可按行分段赋值,也可按行连续赋值。 例如对数组a[5][3]: 1.按行分段赋值可写为static int a[5][3]={ {80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85} }; 2.按行连续赋值可写为static int a[5]...

    python 循环数据赋值实例

    d 第一次循环产生10个20行1列的二维数组 第二次循环产生10个20行2列的二维数值 ….. …. 以上这篇python 循环数据赋值实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软

Global site tag (gtag.js) - Google Analytics