蓝桥杯省模拟 求m*n阶螺旋矩阵中的第r行第j列的值 C++实现

本文介绍了一个算法,用于求解m*n阶螺旋矩阵中任意位置(r, j)的元素值。通过逐步填充矩阵的方式,实现了从边界到内部的螺旋式遍历,最终定位目标元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面

最近有点懒,但是不能停止写博客,整理下前面一段时间在比赛中写的代码,一方面帮助自己学习,另一方面可以给观看此博客的你一点点算法上的思路,如代码有问题,请及时私信与我,我们相互一起学习学习。

问题描述

求m*n阶螺旋矩阵中的第r行第j列的值

输入

4 5
2 3

输出

16

解释
4*5的螺旋矩阵为
1 2 3 4 5
14 15 16 17 6
13 20 19 18 7
12 11 10 9 8

第2行 第3列为 16

代码实现

#include<iostream>

using namespace std;

int k = 0;
int num = 1;
int Fnum = 1;//记录第几组 或者理解为距离最大边界的长度(记录奇数组)
int Snum = 1;//同上 但是记录偶数组
int array[1000][1000];
void show(int a , int b  , int k)//a代表m b 代表 n k代表第几次
{
	if(num > a*b)
	{
		return ;
	}
	if(k == 0)
	{
		for(int j = 0; j < b ; ++j)//先赋值第一行
		{
			array[k][j] = num;
			num++;
		}	
	}
	else
	{
		if(k % 2 == 1)//向下向左赋值  
		{
			for(int i = Fnum ; i <= a -Fnum ;++i) //向右赋值
			{
				array[i][b-Fnum] = num;
				num++;
				if(num > a * b)
				{
					return ;
				}
			}
			for(int j = b - Fnum - 1 ; j >= Fnum-1 ; --j)//向左赋值 ←
			{
				array[a-Fnum][j] = num;
				num++;
				if(num > a*b)
				{
					return ;
				}
			}
			Fnum++;
			k++;			
		}
		if(k % 2 ==0) //向上 向右赋值
		{
			for(int i = a-Snum -1 ; i>=Snum ; i--)//向上赋值 ↑
			{
				array[i][Snum-1] = num;
				num++;
				if(num > a*b)
				{
					return ;
				}
			}
			for(int j = Snum ; j < b-Snum ; ++j) //向右赋值 →
			{
				array[Snum][j]=num;
				num++;
				if(num > a * b)
				{
					return ;
				}
			}
			Snum++;
			
		}
	
	}
	show(a,b,k+1);

}
void printfarray(int a,int b) //打印m行n列数组
{
	for(int i=0 ; i<a ; ++i)
	{
		for(int j=0; j<b ; ++j)
		{
			printf("%4d", array[i][j]);
		}
		cout<<endl;
	}
}
int main()
{
	int a = 0;
	int b = 0;
	cin >> a;
	cin >> b;
	int r = 0;
	int c = 0;
	cin >> r;
	cin >> c;
	show(a,b,0);
	cout << array[r-1][c-1] << endl;
	//printfarray(10,10);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蒜蓉蒸大虾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值