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