数组-螺旋形字符

【题】

晕(选作)


看着这样的“回”形图案你晕吗?

让我们不用数组,来做出它。

输入:
    n。正方形的边长

输出:
    边长为 n 的数字回形方阵。

  测试输入关于“测试输入”的帮助 期待的输出关于“期待的输出”的帮助 时间限制关于“时间限制”的帮助 内存限制关于“内存限制”的帮助 额外进程关于“{$a} 个额外进程”的帮助
测试用例 1 以文本方式显示
  1. 3↵
以文本方式显示
  1.   1  2  3↵
  2.   8  9  4↵
  3.   7  6  5↵
无限制 64M 0
测试用例 2 以文本方式显示
  1. 4↵
以文本方式显示
  1.   1  2  3  4↵
  2.  12 13 14  5↵
  3.  11 16 15  6↵
  4.  10  9  8  7↵
无限制 64M 0
测试用例 5 以文本方式显示
  1. 5↵
以文本方式显示
  1.   1  2  3  4  5↵
  2.  16 17 18 19  6↵
  3.  15 24 25 20  7↵
  4.  14 23 22 21  8↵
  5.  13 12 11 10  9↵
无限制 64M 0
【分析】
           为什么不能用数组实现呢??⊙﹏⊙b     直接计算出来?好吧,暂时没算出了,Coming soon。。。
  

【代码】
  暂时先用数组实现吧,结构很简单,注释写的很清楚,包括走的脚印都打印出来了。。。

#include "stdio.h"

#define MAX 101

int main(int argc, char **argv)
{
	int i, j, n = 4;
	int arr[MAX][MAX];
	int state = 0, num = 0;
	int flag_count = 0;     //记录当前点的四周有几个点不能走

	scanf("%d", &n);
	getchar();

	//初始化
	for (i = 0; i <= n+1; i++)
	{
		for (j = 0; j <= n+1; j++)
		{	
			//加围墙,-1
			if (i == 0 || i == n+1 || j == 0 || j == n+1)
			{
				arr[i][j] = -1;
				continue;
			}
			arr[i][j] = 0;
		}
	}

	//输出初始化后的矩阵
	printf("初始化后的矩阵:\n");
	for (i = 0; i <= n+1; i++)
	{
		for (j = 0; j <= n+1; j++)
		{			
			printf("%3d", arr[i][j]);
		}
		printf("\n");
	}

	printf("\n输出脚印:\n");
	i = 1; j = 1;
	while (1)
	{
		//如果四个方向都走过了,说明已经结束了
		if (flag_count == 4)
		{
			printf("此点四个方向都走过了,跳出。\n", i, j);
			break;
		}

		//如果碰到已走过的,或者围墙,则退一步。退一步其实是为了改变方向
		//其实这个点就是需要改变方向的点
		if (arr[i][j] != 0)
		{
			switch (state)
			{
			case 0:           //当前方向为右,向左退
				j--;
				break;
			case 1:           //当前方向为下,向上退
				i--;
				break;
			case 2:           //当前方向为左,向右退
				j++;
				break;
			case 3:           //当前方向为上,向下退
				i++;
				break;
			}
			//改变方向
			state = (state + 1) % 4;
			flag_count++;
			printf("改变方向的点:(%d, %d)\n", i, j, num);
		}
		else
		{
			arr[i][j] = ++num;
			flag_count = 0;
			printf("(%d, %d) = %3d\n", i, j, num);
		}		

		switch (state)
		{
		case 0:           //向右走
			j++;
			break;
		case 1:           //向下走
			i++;
			break;
		case 2:           //向左走
			j--;
			break;
		case 3:           //向上走
			i--;
			break;
		}
		
	}

	//输出结果
	printf("\n结果:\n");
 	for (i = 1; i <= n; i++)
	{
		for (j = 1; j <= n; j++)
		{			
 			printf("%3d", arr[i][j]);
		}
		printf("\n");
	}
	
	return 0;
}


【运行截图】




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值