求螺旋矩阵

#include<iostream>
using namespace std;
int a[10][10];
int main()
{
	int n,i=1,j=0,k=1;
	cin >> n;
	
	while (k <= n * n)
	{	//!a[i][++j]可以保证这个地方没有数字
		while (j < n && !a[i][j+1]) a[i][++j] =k++;
		//在数组这里不能使用自增自减符,否则会使索引混乱
		while (i < n && !a[i+1][j]) a[++i][j] =k++;
		//由于我的行列数从1开始 所以判断倒数第二行不能超过n
		while (j >1&& !a[i][j-1]) a[i][--j] = k++;
		while (i>1 && !a[i-1][j]) a[--i][j] =k++;

	}

	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <=n; j++)
		{
			printf("%3d", a[i][j]);
		}
		printf("\n");
	}

	return 0;

}

疑问1:把数组定义放在main函数内 就会超时 

疑问2:数组下标从0开始,好像也不行?

以下是使用 C 语言解 n 阶螺旋矩阵的代码,该代码与参考内容思路一致,通过螺旋的方式将数字填充到二维数组中,最后按顺序输出数组元素: ```c #include <stdio.h> int main() { // n 阶螺旋数字方阵,先把数字螺旋输入到数组中,然后把数组中的数字按顺序输出 int n, h, l, i, x = 1; int a[100][100]; printf("请输入一个整数 n\n"); scanf("%d", &n); h = 0; // 行 l = n - 1; // 列 do { // 第一行,n 个 for (i = (n - 1 - l); i <= l; i++) a[h][i] = x++; // 最后一列,n - 1 个 for (i = h + 1; i <= (n - 1 - h); i++) a[i][l] = x++; // 最后一行,n - 1 个 for (i = l - 1; i >= (n - 1 - l); i--) a[n - 1 - h][i] = x++; h++; // 下个循环 h 要加 1,为下一个 for 循环减少一个行数 // 第一列(比最后一列少输入一个),n - 2 个 for (i = (n - 1 - h); i >= h; i--) a[i][n - 1 - l] = x++; l--; // 下个循环列要减 1 } while (x <= (n * n)); // 把数组内的数字按顺序输出 for (i = 0; i < n; i++) { for (h = 0; h < n; h++) printf("%5d,", a[i][h]); printf("\n"); } return 0; } ``` ### 方法解释 1. **输入处理**:程序首先提示用户输入一个整数 `n`,该整数代表螺旋矩阵的阶数。 2. **初始化变量**:定义了行 `h`、列 `l`、循环变量 `i` 以及填充数字 `x`,并初始化二维数组 `a`。`h` 初始化为 0,`l` 初始化为 `n - 1`,`x` 初始化为 1。 3. **螺旋填充**:使用 `do-while` 循环,每次循环填充矩阵的一圈。在每一圈中,按顺时针方向依次填充矩阵的上、右、下、左四条边。每次填充完一圈后,行索引 `h` 加 1,列索引 `l` 减 1,继续填充下一圈,直到填充完所有元素(即 `x > n * n`)。 4. **输出结果**:使用嵌套的 `for` 循环遍历二维数组 `a`,并按行输出矩阵元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值