求m*n阶螺旋矩阵 C++实现

写在前面

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

问题描述

求 m*n阶螺旋矩阵

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

输入

4 5

输出

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

算法思路

1.将矩阵模拟成子问题,先赋值第一行元素,不难发现进行下一层模拟的时候(向下赋值之后再向左赋值)都是赋值相同元素 同理之后(向上向下赋值)也赋值相同元素
举个例子
赋值完第一行 1 2 3 4 5 之后 赋值 6 7 8 和 9 10 11 12 都是4-1 个和 5-1个元素 同理之后 赋值13 14 和赋值 15 16 17都是赋值 4-2个元素和5-2个元素
如此递归下去,当sum大于m*n时就跳出循环

代码实现

#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;

	show(a,b,0);
	
	printfarray(a,b);
	return 0;
}

如果不要递归的话,用while循环也可以实现,参考代码的地方https://blog.csdn.net/weixin_44164153/article/details/105618209?fps=1&locationNum=2?ops_request_misc=&request_id=&biz_id=102&utm_source=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0

具体代码实现

#include<iostream>

using namespace std;

int array[101][101];
void fun(int m , int n)
{
    int array_i = 0;
    int array_j = 0;
    int max_i = m;
    int max_j = n;
    int sum = 1;
    while(true)
    {
        for (int j = array_j; j < max_j;++j)
        {
            array[array_i][j] = sum;
            sum++;
            if(sum > m * n)
            {
                return;
            }
        }
        array_i++;//当前最小array_i行已经赋值
        for (int i = array_i; i < max_i;++i)
        {
            array[i][max_j - 1] = sum;
            sum++;
            if(sum > m * n)
            {
                return;
            }
        }
        max_j--;//当前最大列max_j已经赋值
        for (int j = max_j - 1; j >= array_j;--j)
        {
            array[max_i - 1][j] = sum;
            sum++;
            if(sum > m * n)
            {
                return;
            }
        }
        max_i--;//当前最大行max_i已经赋值
        for (int i = max_i - 1; i >= array_i;--i)
        {
            array[i][array_j] = sum;
             sum++;
            if(sum > m * n)
            {
                return;
            }
        }
        array_j++;//当前最小列array_j已经赋值
    }
}

void printfarray(int m , int n)
{
    for (int i = 0; i < m;++i)
    {
        for (int j = 0; j < n;++j)
        {
            cout << array[i][j] << " ";
        }
        cout << endl;
    }
}
int main()
{
    fun(4,5);
    printfarray(4,5);
    return 0;
}
发布了16 篇原创文章 · 获赞 3 · 访问量 508

猜你喜欢

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