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

写在前面

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

问题描述

求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;
}
发布了16 篇原创文章 · 获赞 3 · 访问量 509

猜你喜欢

转载自blog.csdn.net/weixin_43381566/article/details/105690593