网易2020笔试题:顺时针逆时针交叉填充数组

索引请参考:系列目录
题目:

  • 定义N维蛇形方阵的生成方式如下:把1~N^2依次填入矩阵中,并且填入的时候,会从矩阵最外圈填,当最外圈填完后,会继续填写此外圈,一开始填写外圈的时候,会按照顺时针填入数字,到此外圈的时候,会用逆时针填入,在一圈则又会采用顺时针填写的方式,以这种顺时针、逆时针交错的填写的方式,直到所有数字填写完毕。
  • 示例:
  • 假设N= 7,7维方阵为:
    在这里插入图片描述
  • 给定N,给出带哦个需要查询的坐标(x,y),请输出N维蛇形方阵中(x,y)的值是多少。
  • 假设左上角为(0,0),x代表行号,从上到下依次为0~N-1。y代表列号,从左到右依次为0 ~ N-1

#include<iostream>
#include<vector>

void print(std::vector<std::vector<int>> & arr);
void PrintNumber(std::vector<std::vector<int>> & arr);
void inputClockwiseNumber(std::vector<std::vector<int>> & arr, const int start, const int N);
void inputCounterclockwiseNumber(std::vector<std::vector<int>> & arr, const int start, const int end);
static int num = 1;

int main()
{
	std::cout << "请输入方阵维度:";
	int N;
	std::cin >> N;
	std::cin.get();
	std::cout << "几个查询:";
	int num;
	std::cin >> num;
	std::cin.get();
	std::vector<std::vector<int>> arr2(N, std::vector<int>(N));
	PrintNumber(arr2);
	print(arr2);
	std::vector<std::pair<int, int>>coor;
	for (int i = 0; i < num; i++)
	{
		std::cout << "x:";
		int x;
		std::cin >> x;
		std::cin.get();
		std::cout << "y:";
		int y;
		std::cin >> y;
		std::cin.get();
		coor.push_back({ x,y });
	}
	for (int i = 0; i < num; i++)
	{
		std::cout << arr2[coor[i].first][coor[i].second] << std::endl;
	}
	return 0;
}

void print(std::vector<std::vector<int>> & arr) {

		int heigh = arr.size();
		int width = arr[0].size();
		for (int i = 0; i < heigh; i++)
		{
			for (int j = 0; j < width; j++)
				std::cout << arr[i][j] << "\t";
			std::cout << std::endl;
		}
		
		std::cout << std::endl;
}

void PrintNumber(std::vector<std::vector<int>> & arr) {

	int start = 0;
	int end = arr.size() - 1;
	int colRow = arr.size();
	while (colRow > start * 2)
	{
		//顺时针填写
		if (start % 2 == 0)
			inputClockwiseNumber(arr, start++, end--);
		//逆时针填写
		else
			inputCounterclockwiseNumber(arr,start++, end--);
	}
}

//顺时针
void inputClockwiseNumber(std::vector<std::vector<int>> & arr,const int start, const int end) {
	
	//从左到右
	for (int i = start; i <= end; i++)
		arr[start][i] = num++;
	//从上到下
	if (start < end)
	{
		for (int i = start + 1; i <= end; i++)
			arr[i][end] = num++;	
	}
	//从右到左
	if (start < end)
	{
		for (int i = end - 1; i >= start; i--)
			arr[end][i] = num++;
	}
	//从下到上
	if (start < end - 1)
	{
		for (int i = end - 1; i > start; i--)
			arr[i][start] = num++;
	}
}

//逆时针
void inputCounterclockwiseNumber(std::vector<std::vector<int>> & arr, const int start, const int end) {

	//从上到下
	for (int i = start; i <= end; i++)
		arr[i][start] = num++;
	//从左到右
	if (start < end)
	{
		for (int i = start + 1; i <= end; i++)
			arr[end][i] = num++;
	}
	//从下到上
	if (start < end - 1)
	{
		for (int i = end - 1; i >= start; i--)
			arr[i][end] = num++;
	}
	//从右到左
	if (start < end )
	{
		for (int i = end - 1; i > start; i--)
			arr[start][i] = num++;
	}
}

运行结果:
在这里插入图片描述

评注:该题目是在面试过程中看似很复杂,但实际其算法本身并不复杂,但是需要考虑各种情况。算法具体思路请参考上一篇:剑指offer面试题29:顺时针打印矩阵
在实际参加考试的时候,我们所写的算法需要我们在ACM模式下进行,即需要把程序的主函数等全都写出来并测试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值