C++输出螺旋数组


作业题目:
输出以下内容(5X5的螺旋数组):
 1     2     3     4    5
16   17   18   19   6
15   24   25   20   7
14   23   22   21   8
13   12   11   10   9

思路:

  1. 使用二维数组,为使其不局限于5X5,二维数组是一个动态的二维数组,两个下标分别为x、y,数组 arr[x][y]。
  2. 使用for循环,循环初始值temp为1,结束条件为temp小于数组两个下标相乘得到的积,缺省循环后置表达式,for循环内还有4个for循环
  3. 循环开始:如下图:
    C++输出螺旋数组
    第一圈:从第一排第一个开始
    3.1 第一个循环:数组从左到右赋值
    3.2 第二个循环:数组从上到下赋值
    3.3 第三个循环:数组从右到左赋值
    3.4 第四个循环:数组从下到上赋值,
    第一次,循环结束。
    第二圈:数组下标进行自增,定位到第二排第二个,再执行上面的循环。
    第三圈:数组下标进行自增,定位到第三排第三个,再执行上面的循环
    ……
    循环结束。

4.使用两个循环,输出数组。
5. 删除动态数组

具体实现代码如下:

1、建立二维数组

C++输出螺旋数组

2、声明变量

C++输出螺旋数组

3、循环开始:

以下解说以 5 X 5 为例:

3.1 第一个循环:数组从左到右赋值

K = 25,temp = 1
第一圈:arr[0][0] = 1  , arr[0][1] = 2 , arr[0][2] = 3,arr[0][3] = 4
第二圈:arr[1][1] = 17, arr[1][2] = 18
C++输出螺旋数组

3.2 第二个循环:数组从上到下赋值

第一圈:arr[0][4] = 5 , arr[1][4] = 6 , arr[2][4] = 7,arr[3][4] = 8
第二圈:arr[1][3] = 19,arr[2][3] = 20
C++输出螺旋数组

3.3 第三个循环:数组从右到左赋值

第一圈:arr[4][4] = 9 , arr[4][3] = 10 , arr[4][2] = 11,arr[4][1] = 12
第二圈:arr[3][3] = 21,arr[3][2] = 22
C++输出螺旋数组

3.4 第四个循环:数组从下到上赋值

第一圈:arr[4][0] = 13, arr[3][0] = 14, arr[2][0] = 15,arr[1][0] = 16
第二圈:arr[3][1] = 23, arr[2][1] = 24
C++输出螺旋数组
此时(自增前):
第一圈:x = 0, y = 0, a = 0, b = 0, num = 0,temp = 17
第二圈:x = 1, y = 1, a = 1, b = 1, num = 1,temp = 25

3.5 自增,数组下标重新定位,圈数自增

此时(自增后)
第一圈:x = 1, y = 1, a = 1, b = 1, num = 1
第一圈:x = 1, y = 1, a = 1, b = 1, num = 1
C++输出螺旋数组

3.6 补充

arr[2][2] = 25
C++输出螺旋数组

4、输出

C++输出螺旋数组

5、删除二维数组,释放内存

C++输出螺旋数组

输出结果: 5 X 5

C++输出螺旋数组

带下标的输出:

C++输出螺旋数组

输出结果: 11 X 7

C++输出螺旋数组

对于上面的for循环内的4个for循环里的if判断的补充说明:
在某些情况下,基于4个for循环,会导致部分已经被赋值过的数组再次被赋值,原本的会被覆盖掉,
加上if判断后,可以避免这种情况的发生。

如下图,是不加if判断的运行结果,请参照对比上面相同位置的 11 X 7:

C++输出螺旋数组

感谢您的浏览。

#include<iostream>
using namespace std;
void main()
{
	//二维数组
	int **arr = NULL;
	int m, n;
	cout << "想要几乘几的方阵,请输入两个整数: ";
	cin >> n >> m;
	arr = new int*[m];
	for (int i = 0; i < m; i++)
	{ 
		arr[i] = new int[n]; 
	}

	// x,y 数组下标   a:记录行   b:记录列
	int x = 0, y = 0, a = 0, b = 0;
	int num = 0;//循环圈数
	int k = m*n;//输出的最后一个数
	int temp = 1;//给数组赋的值

	//循环开始
	for (; temp < k; )
	{
		//第 a 行 第 b 到 n-1 列  -> 从左到右
		for (y = b; y < n - 1 - num; y++)
		{
			if (arr[x][y] < 0) 
			{
				arr[x][y] = temp;
				temp++;
			}
			//	cout << "arr[" << x << "][" << y << "] = " << arr[x][y] << "\n";
		}
		
		//第 a - c 行 第 d 列  \|/ 从上到下
		for (x = a; x < m - 1 - num; x++)
		{
			if (arr[x][y] < 0) 
			{
				arr[x][y] = temp;
				temp++;
			}
			//	cout << "arr[" << x << "][" << y << "] = " << arr[x][y] << "\n";
		}
		
		//第 c 行 第 d - b  列  <- 从右到左
		for (y = n - 1 - num; y > b; y--)
		{
			if (arr[x][y] < 0) 
			{
				arr[x][y] = temp;
				temp++;
			}
			
		//第 c -a 行 第 b 列   /|\  / 从下到上
		for (x = m - 1 - num; x > a; x--)
		{
			if (arr[x][y] < 0) 
			{
				arr[x][y] = temp;
				temp++;
			}
			//	cout << "arr[" << x << "][" << y << "] = " << arr[x][y] << "\n";
		}
		
		//自增 改变操作行和列
		x++;
		y++;
		a++;
		b++;
		num++;		
		/*
		  cout << a << "\t" 
			   << b << "\t" 
			   << x << "\t" 
			   << y << "\t" 
			   << num << "\t" 
			   << temp << "\n";
		*/
	}

	//补充,数组两个下标相等,且都为奇数的情况下,
	//位于数组最中间的那个位置的数(最后一个数),
	//循环不到,在此作补充
	if (temp == k)
	{
		if (arr[x][y] <= 0)
		{
			arr[x][y] = temp;
		}
	}

	//输出
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cout << arr[i][j] << '\t';
			//cout << "arr[" << i << "][" << j << "] = " << arr[i][j] <<"\t";
		}
		cout << endl;
	}

	//删除数组
	for (int i = 0; i < m; i++) 
	{
		delete[] arr[i]; 
	}
	delete arr;
}