vj第一周题单|洛谷|蛇形方阵

Description

给出一个不大于 9的正整数 n,输出 n×n
的蛇形方阵。

从左上角填上 1 开始,顺时针方向依次填入数字,如同样例所示。注意每个数字有都会占用 3 个字符,前面使用空格补齐。

Input

输入一个正整数 n,含义如题所述。

Output

输出符合题目要求的蛇形矩阵。

Sample 1:

Input:

4

Output:

  1  2  3  4
 12 13 14  5
 11 16 15  6
 10  9  8  7

Hint

数据保证,1≤n≤9。

思路:

我们可以将矩阵分割成多个正方形封闭线条,如4*4的矩阵的矩阵可以分割为两个正方形封闭线条,即外围的1到12(顺时针)看成第一个正方形封闭曲线,而内层的13到16(顺时针)可以看成第二个正方形封闭曲线,而对于每个正方形封闭曲线都由四条线组成(从左到右递增,然后从上到下递增,然后从右到左递增,最后从下到上递增,回到起点),四条曲线可以分成四部分程序,所以,把程序分为x(矩阵的正方形封闭曲线数量)个大部分,每个大部分又可以分成四个小部分(即从左到右递增,然后从上到下递增,然后从右到左递增,最后从下到上递增)

如图,4*4的矩阵的矩阵可以分割为两个正方形封闭线条

笔者答案:

#include<stdio.h>
int main ()
{
	int i,j;//用于循环
	int n;//矩阵的维度
	int zs,ys;//zs:每个正方形左上角元素的列数(即纵坐标),ys:每个正方形右上角元素的列数(即纵坐标)
	int p=1;//填充矩阵的数
	int a[10][10];
	scanf("%d",&n);
	for(zs=1,ys=n;zs<(double)n/2+1;zs++,ys--)//每个循环代表一个正方形封闭线条的递增过程,以ys和zs作为每个正方形封闭线条的参数来进行循环
	{
		for(i=zs,j=zs;j<=ys;j++)//从左到右
		{
			a[i][j]=p;
			p++;
		}
		for(i=zs+1,j=ys;i<=ys;i++)//从上到下
		{
			a[i][j]=p;
			p++;
		}
		for(i=ys,j=ys-1;j>=zs;j--)//从右到左
		{
			a[i][j]=p;
			p++;
		}
		for(i=ys-1,j=zs;i>zs;i--)//从下到上
		{
			a[i][j]=p;
			p++;
		}
	}
	for(i=1;i<=n;i++)//数组的打印
	{
			for(j=1;j<=n;j++)
		{
			printf("%3d",a[i][j]);
		}
			printf("\n");
	}
	return 0;
}

易错点:

1.外部循环的结束条件为:zs<(double)n/2+1;

2.递增过程赋值时正方形的四个角的元素容易被重复赋值(如从左到右递增赋值后,“从右到下”的第一个元素应该要确保不是“从左到右赋值过程的最后一个元素”),造成结果错误;

总结:

画图能使编程思维更清晰

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
题目C要求我们在一个网格图中求一条从起点到终点的路径,其中有障碍物阻挡了一些格子。这可以用回溯法进行求解。 我们可以用一个二维数组来表示网格图,其中0表示可以通过的格子,1表示障碍物阻挡的格子,2表示路径上的格子。我们可以从起点开始,不断尝试向右、向下、向左、向上四个方向前进,如果前进的下一个格子是可以通过的,则继续前进;如果下一个格子是障碍物或者已经走过,则回溯到上一个格子重新选择方向前进。当我们到达终点时,我们就找到了一条从起点到终点的路径。 这个过程可以用递归函数来实现。具体实现过程如下: 1. 定义一个递归函数`dfs(x, y)`,表示从坐标(x, y)开始寻找路径。 2. 检查当前坐标是否越界。如果越界,则返回false。 3. 检查当前坐标是否为终点。如果是,则返回true。 4. 检查当前坐标是否为障碍物或者已经走过。如果是,则返回false。 5. 将当前坐标标记为已经走过。 6. 尝试向右、向下、向左、向上四个方向前进。如果有一个方向前进成功,则返回true。 7. 如果四个方向都不能前进,则将当前坐标标记为未走过,并返回false。 8. 在主函数中,从起点开始调用递归函数`dfs(0, 0)`,如果返回true,则表示找到了一条路径,可以输出路径;否则表示不存在路径。 需要注意的是,在标记一个坐标为已经走过时,我们需要使用一个变量来记录是否已经走过,因为在回溯的过程中,我们需要将已经走过的坐标重新标记为未走过。 以上就是题目C的建模过程,可以根据这个思路进行编程实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值