题目链接:P5731 【深基5.习6】蛇形方阵 - 洛谷

1.题目分析

2.算法原理

解法:模拟填数过程即可(实现的方式有很多种,这里给大家介绍一种通用的解法 - 解决矩阵中填数的题自)

1.定义方向向量

结合这道题目,它的坐标是从左上角开始的,所以左上角是00或者11,正常情况下x轴向右y轴向上,不管坐标轴怎么画,方向向量的含义是不变的

假设更开始处于坐标(0,0),向右走一步(0,1)向右走一步(0,2),x轴是不变的,仅仅是y轴的坐标每次递增1,如何在代码里实现一步一步向右走的过程,用方向向量的方式定义两个数组,int dx[] = [0,],int dy[] = [1,],dx里面的0表示x的便宜量是0,y里面的1表示y轴的偏移量是1,用这两个数结合就可以实现一步一步向右走了,比如此时在(2,3)位置,向右走一格可以让(2,3)+(0,1)->(2,4),(0,1)是向右走一格,如图还可以向下左上走,此时加上数组里面的每一个偏移量就完成了上下左右四个方向的转移了,并且我们定义的这个顺序正好跟这道题蛇形方阵,是一样的顺时针方向,如果这道题的填数规则改成逆时针的话,仅需把右上左下的顺序调整一下,就完成了一个逆时针方向


2.根据规则结合方向向量填数

  1. 朝一个方向走,一边走一边填数,直到越界
  2. 越界之后,结合方向向量,重新计算出新的坐标以及方向

代码:

#include <iostream>
using namespace std;

const int N = 15;

//定义右下左上四个方向
int dx[] = { 0,1,0,-1 };
int dy[] = { 1,0,-1,0 };

int arr[N][N];

int main()
{
	int n; cin >> n;

	//1.模拟填数过程
	int x = 1, y = 1; //初始位置
	int cnt = 1; //当前位置要填的数
	int pos = 0; //当前的方向
	while (cnt <= n * n)
	{
		arr[x][y] = cnt;

		//计算下一个位置
		//当前在(x,y),加上对应dx,dy里的偏移量.产生新位置(a,b)
		int a = x + dx[pos], b = y + dy[pos];
		
		//判断是否越界
		//arr[a][b]表示走到了填过数的位置
		if (a > n || b < 1 || b > n || arr[a][b])
		{
			//更新出正确要走的位置
			pos = (pos + 1) % 4;
			a = x + dx[pos], b = y + dy[pos];
		}
		x = a, y = b;
		//更新完后准备填下一个位置;
		cnt++;
	}

	//输出
	for (int i = 1; i <= n; ++i)
	{
		for (int j = 1; j <= n; ++j)
		{
			printf("%3d", arr[i][j]);
		}
		puts("");
	}

	return 0;
}
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐