`
arust
  • 浏览: 95155 次
  • 性别: 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
分享到:
评论

相关推荐

    易语言学习进阶二维数组赋值

    本文将详细讲解易语言中二维数组的赋值方法,并通过实例源码帮助你深入理解这一概念。 二维数组,顾名思义,是具有两个索引维度的数组,可以看作是由若干个一维数组排列而成的一个矩形阵列。在易语言中,二维数组...

    autoit 解决二维数组动态赋值

    本文将深入探讨AutoIt中如何解决二维数组的动态赋值问题。 在AutoIt中,数组分为一维数组和二维数组。一维数组是一系列按顺序存储的数据集合,而二维数组则可以理解为由多个一维数组构成的矩阵,通常用于表示表格...

    易语言学习进阶二维数组赋值源码

    本篇文章将深入探讨易语言中的二维数组赋值以及相关源码解析。 首先,了解易语言的基本语法对于学习二维数组至关重要。易语言采用中文作为编程语言,降低了编程的入门难度,其语法简洁明了。二维数组在易语言中定义...

    C++动态二维数组的申请、赋值、使用、释放以及作参数示例

    ### C++动态二维数组的申请、赋值、使用、释放及作参数详解 #### 一、引言 在C++编程中,动态二维数组是非常重要的数据结构之一,它能够根据程序运行时的需求灵活地分配内存空间。本文将详细介绍如何在C++中创建、...

    易语言源码易语言学习进阶二维数组赋值源码.rar

    3. **赋值**:对二维数组进行赋值,可以逐个元素赋值,也可以通过循环结构批量赋值。例如,如果要将某个值赋给数组的第i行第j列,可以这样写: ```易语言 二维数组名[i][j] = 值 ``` 4. **访问**:访问二维数组...

    matlab数组循环赋值

    MATLAB 数组循环赋值 MATLAB 是一个功能强大的数学软件包,广泛应用于科学计算、数据分析和可视化等领域。在 MATLAB 中,数组是一种基本的数据类型,广泛应用于科学计算和数据分析。数组循环赋值是 MATLAB 中的一种...

    Delphi中静态二维数组的使用

    本教程将深入探讨如何在Delphi中使用静态二维数组来实现九九乘法表的输出,这有助于理解Delphi中的数组概念以及基本的循环控制结构。 首先,我们需要了解什么是静态二维数组。在Delphi中,静态数组是在编译时声明并...

    [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……...

    TIA博途中通过AT指令和二维数组实现IO点位映射的具体方法示例.docx

    接着,使用两层FOR循环遍历这个二维数组。外层循环遍历行,内层循环遍历列。在每次循环中,可以通过赋值操作来改变数组中的元素,从而模拟IO点的通断状态。例如,`Array[i][j] := TRUE;`会将数组的第i行第j列的元素...

    Javascript中二维数组的遍历

    在上面的代码中,我们首先创建了一个空数组 `array32`,然后将其赋值为一个二维数组。每个元素是一个数组,包含三个元素:一个字符串、一个数字和一个字符串。 遍历二维数组 要遍历二维数组,我们可以使用两个嵌套...

    java 二维数组的创建与使用

    在Java编程语言中,二维数组是一种特殊的数组,它由多个一维数组组成,形如一个矩阵。二维数组常用于处理表格数据或者进行矩阵运算。本文将深入探讨Java中二维数组的创建、初始化、访问和操作。 ### 1. 创建二维...

    java二维数组的理解

    第一行通过`for (int[] x : arr2)`将二维数组`arr2`中的每一行赋值给一个一维数组`x`;第二行通过`for (int e : x)`遍历这个一维数组中的所有元素。 #### 四、Java动态二维数组 Java动态二维数组是指那些在运行时...

    matlab数组循环赋值.zip

    - 对于二维数组,可以使用冒号`:`来选择行或列,如`A(:,2)`选择所有行的第二列,`A(3,:)`选择第三行的所有列。 3. **向量化操作**: - MATLAB鼓励向量化操作,即避免显式的循环。例如,如果我们想要将数组`b`的每...

    matlab数组循环赋值.md

    ### MATLAB中数组循环赋值详解 #### 知识点概览 本文主要讲解了如何在MATLAB中使用循环结构对数组进行循环赋值的操作。通过本篇内容的学习,读者不仅能够掌握基本的循环赋值方法,还能深入了解其背后的原理及实际...

    c# 二维数组代码 (不是很详细的,简单举例)

    二维数组的遍历通常采用for循环,遍历整个数组。以下是一个简单的示例: ```csharp for (int i = 0; i (0); i++) { for (int j = 0; j (1); j++) { Console.WriteLine(numbers[i, j]); } } ``` 这段代码会打印...

    java二维数组

    可以使用双重循环来打印二维数组的元素: ```java public static void Prin(int arr[][]) { for (int i = 0; i ; i++) { for (int j = 0; j [i].length; j++) { System.out.print(arr[i][j] + " "); } System....

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

    根据提供的代码片段,我们可以深入探讨数组的使用方法,尤其是针对一维和二维数组的初始化、赋值以及如何在实际场景中应用这些数组。 ### 一维数组与二维数组的初始化 在代码示例中,作者使用了`pb`(PowerBuilder...

    C语言-----二维数组

    例如,要找出3x4二维数组中的最大值及其位置,可以使用两个嵌套循环遍历所有元素,如下所示: ```c int main() { int i, j, row = 0, col = 0, max; int a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}}; max = a[0...

    C#二维数组怎么做

    题目中给出的代码片段包含了对二维数组的操作,包括初始化、赋值以及一个二维数组相加的方法实现。 ##### 4.1 初始化与赋值 ```csharp int[,] a1 = new int[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; int[,]...

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

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

Global site tag (gtag.js) - Google Analytics