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