C++输出螺旋数组
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
思路:
- 使用二维数组,为使其不局限于5X5,二维数组是一个动态的二维数组,两个下标分别为x、y,数组 arr[x][y]。
- 使用for循环,循环初始值temp为1,结束条件为temp小于数组两个下标相乘得到的积,缺省循环后置表达式,for循环内还有4个for循环
- 循环开始:如下图:
第一圈:从第一排第一个开始
3.1 第一个循环:数组从左到右赋值
3.2 第二个循环:数组从上到下赋值
3.3 第三个循环:数组从右到左赋值
3.4 第四个循环:数组从下到上赋值,
第一次,循环结束。
第二圈:数组下标进行自增,定位到第二排第二个,再执行上面的循环。
第三圈:数组下标进行自增,定位到第三排第三个,再执行上面的循环
……
循环结束。
4.使用两个循环,输出数组。
5. 删除动态数组
具体实现代码如下:
1、建立二维数组
2、声明变量
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
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
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
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
此时(自增前):
第一圈: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
3.6 补充
arr[2][2] = 25
4、输出
5、删除二维数组,释放内存
输出结果: 5 X 5
带下标的输出:
输出结果: 11 X 7
对于上面的for循环内的4个for循环里的if判断的补充说明:
在某些情况下,基于4个for循环,会导致部分已经被赋值过的数组再次被赋值,原本的会被覆盖掉,
加上if判断后,可以避免这种情况的发生。
如下图,是不加if判断的运行结果,请参照对比上面相同位置的 11 X 7:
感谢您的浏览。
#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;
}