写在前面
最近有点懒,但是不能停止写博客,整理下前面一段时间在比赛中写的代码,一方面帮助自己学习,另一方面可以给观看此博客的你一点点算法上的思路,如代码有问题,请及时私信与我,我们相互一起学习学习。
问题描述
求 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) //向右赋值