使用C++输出螺旋方阵

使用C++输出螺旋方阵

问题描述:

使用C++实现输出螺旋方阵,已运行就出错,求解答!

#include <iostream>
#include <string.h>
#include <iomanip>
using namespace std;

int number[1000][1000] = {0}, start = 1, turn_right = 0, turn_down = 0;

void run(int num) { //此参数作为螺旋方阵边长
	int temp_long = num;
//	memset(number, 0, sizeof(number));
	for (int icircle = 0; icircle < num / 2; icircle++) {
		for (; turn_right < temp_long - 1; turn_right++) { //从左到右
			number[turn_down][turn_right] = start++;
			cout << number[turn_down][turn_right] << endl;
		}
		for (; turn_down < temp_long - 1; turn_down++) { //从上到下
			number[turn_down][turn_right] = start++;
		}
		for (turn_right = temp_long - 1; turn_right > icircle;
		        turn_right--) { //turn_right定位到本圈本行末尾,icircle的值为本圈第一个元素的下标
			number[turn_down][turn_right] = start++;
		}
		for (turn_down = temp_long - 1; turn_down > icircle; turn_down--) {
			number[turn_down][turn_right] = start++;
		}
		turn_down--;
		temp_long--;
		start--;
	}
	if (num % 2 == 1) {
		number[turn_down][turn_right + 1] = start++;
	}
	for (int i = 0; i < num; i++) {
		for (int i2 = 0; i2 < num; i2++) {
			cout << setw(2) << number[i][i2];
		}
		cout << endl;
	}
}

int main() {
	int size;
	cout << "请输入螺旋方阵边长:";
	cin >> size;
	run(size);
	return 0;
}

问题找到了。如果解决,点个采纳吧!

问题一:

当最后执行完这条语句时,

for (turn_down = temp_long - 1; turn_down > icircle; turn_down--) {
       number[turn_down][turn_right] = start++;
}

此时turn_down已经是0了;然后下面你在对他进行turn_down--;操作,索引就变成负数了,导致数组越界报错。

解决办法:turn_down++;改成++操作。

 

问题二:

这个//start--;需要注释掉。不然无法达到螺旋效果。

 

void run(int num) { //此参数作为螺旋方阵边长
	int temp_long = num;
	//	memset(number, 0, sizeof(number));
	for (int icircle = 0; icircle < num / 2; icircle++) {
		for (; turn_right < temp_long - 1; turn_right++) { //从左到右
			number[turn_down][turn_right] = start++;
			cout << number[turn_down][turn_right] << endl;
		}
		for (; turn_down < temp_long - 1; turn_down++) { //从上到下
			number[turn_down][turn_right] = start++;
		}
		for (turn_right = temp_long - 1; turn_right > icircle; turn_right--) { //turn_right定位到本圈本行末尾,icircle的值为本圈第一个元素的下标
			number[turn_down][turn_right] = start++;
		}
		for (turn_down = temp_long - 1; turn_down > icircle; turn_down--) {
			number[turn_down][turn_right] = start++;
		}

		turn_down++;        // 改成++操作
		temp_long--;
		//start--;            // 注释掉
	}
	if (num % 2 == 1) {
		number[turn_down][turn_right + 1] = start++;
	}
	for (int i = 0; i < num; i++) {
		for (int i2 = 0; i2 < num; i2++) {
			cout << setw(2) << number[i][i2] << "\t";
		}
		cout << endl;
	}
}

把错误信息贴出来看看,更好分析原因。

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y