XDOJ C语言 螺旋方阵 思路以及源码

原题:
所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。

输入格式:
输入在一行中给出一个正整数N(<10)。

输出格式:
输出N×N的螺旋方阵。每行N个数字,每个数字占3位。

输入样例:

5

输出样例

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’,然后根据输入的数字是5,在(1,1)到(5,5)从‘-1’组成的大方阵中开辟出一块被‘-1’围住的全是‘0’的小方阵,我们将在这块方阵中通过改写元素,完成螺旋方阵。

我们可以把方阵中的每个数字当成一个机器人的站立位点,机器人只能站改写‘0’位点,当机器人检测出站立位点是‘0’时,它就会改写‘0’位点,如果检测出不是‘0’,那么它就要跳回去,根据具体情况改变前进方向。

那么怎么判断机器人应该往哪边拐弯呢?

机器人不断循环重复向下、向左、向上、向右拐弯,所以只要检测出第几次拐弯,就能确定方向。如何检测我会写在注释里。

当检测出机器人改写的数字等于输入数字的平方时,即可打印方阵,结束程序。

#include<stdio.h>
int s[150][150];
int main() {
	int n, k = 0, t = 1, i = 1, j = 1;
	scanf("%d", &n);
	for ( i = 0; i < 150; i++) {
		for ( j = 0; j < 150; j++) {
			s[i][j] = -1;
		}
	}//初始化二维数组为‘-1’

	for ( i = 1; i <= n; i++) {
		for ( j = 1; j <= n; j++) {
			s[i][j] = 0;
		}
	}//开辟出小方阵,就是机器人所能站立的位点

	i = 1;
	j = 1;//进入主体循环前,准备好i,j
	for (; k < n * n;) {//一种子循环代表一种前进方向
		if (t == 1) {//这里的t用来记录转向的次数
			for (;;) {//向右前进
				if (s[i][j] == 0) {//一旦检测出下一个位点不是‘0’,跳出这个循环,转到另一个方向
					k++;
					s[i][j] = k;
					j++;
				} else {
					j--;//跳回去
					i++;//站到下个方向的第一个位点上
					t++;
					break;
				}
			}
		}
		if (t == 2) {//向下前进
			for (;;) {
				if (s[i][j] == 0) {
					k++;
					s[i ][j] = k;
					i++;
				} else {
					i--	;
					j--;
					t++;
					break;
				}
			}
		}
		if (t == 3) {//向左前进
			for (;;) {
				if (s[i][j] == 0) {
					k++;
					s[i][j] = k;
					j--;
				} else {
					j++;
					i--;
					t++;
					break;
				}
			}
		}
		if (t == 4) {//向上走
			for (;;) {
				if (s[i][j] == 0) {
					k++;
					s[i][j] = k;
					i--;
				} else {
					i++;
					j++;
					t = 1;
					break;
				}
			}
		}
	}

	for (int i = 1; i <= n; i++) {//打印出螺旋方阵
		for (int j = 1; j <= n; j++) {
			printf("%d ", s[i][j]);
		}
		printf("\n");
	}

	return 0;
}


如果有更简单的程序,请私信发送给作者,感谢感谢。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是用C语言实现螺旋方阵的示例代码,代码中使用了二维数组来存储方阵数据: ```c #include <stdio.h> #define N 5 // 方阵的行列数 int main() { int matrix[N][N]; // 定义二维数组存储方阵数据 int i, j, k; int num = 1; // 要填充的数字 int start_row = 0, end_row = N - 1; // 起始和结束行 int start_col = 0, end_col = N - 1; // 起始和结束列 // 填充方阵 while (start_row <= end_row && start_col <= end_col) { // 从左到右填充一行 for (j = start_col; j <= end_col; j++) matrix[start_row][j] = num++; // 从上到下填充一列 for (i = start_row + 1; i <= end_row; i++) matrix[i][end_col] = num++; // 如果还有未填充的行和列,从右到左填充一行 if (start_row != end_row) for (j = end_col - 1; j >= start_col; j--) matrix[end_row][j] = num++; // 如果还有未填充的行和列,从下到上填充一列 if (start_col != end_col) for (i = end_row - 1; i > start_row; i--) matrix[i][start_col] = num++; // 更新起始和结束行、列的值 start_row++; end_row--; start_col++; end_col--; } // 输出方阵 printf("螺旋方阵为:\n"); for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { printf("%2d ", matrix[i][j]); } printf("\n"); } return 0; } ``` 该代码使用了一个while循环,不断填充方阵中的数字,直到所有位置都填充完毕。在填充过程中,根据当前的起始和结束行、列的值,分别从左到右、从上到下、从右到左、从下到上四个方向填充数据。在每个方向填充完毕后,更新起始和结束行、列的值,进入下一个方向的填充。最终输出填充完成的螺旋方阵

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值