给一个m*n的数组,要求你进行螺旋填数,例如5 * 4
这个问题通过递归可以通过递归的方式来解决,填数的方式类似于这个样子
看懂了吗?
可以设置5个参数,rl 是该环中首行的序号,rh为该环中最后一行的行号,cl为该环中第一列的列号,cr为该环中最后一列的列号,num表示需要填入的第一个数。
每次进入下一层填数的时候,rl + 1, rh - 1, cl + 1, cr - 1。
递归基是rl > rh || cl > cr
递归条件里进行对每一环的填数,需要填上下两行,左右两列。可用四个for循环来实现
第一行中,行数都为rl,列数为cl到cr。
右边一列中,列数都为cr, 行数为rl + 1到rh。
最后一行中,行数为rh,列数为cr - 1 到cl。
第一列中,列数都为cl,行数为rh - 1到rl + 1。
代码实现如下:
//
// main.cpp
// spitial
//
// Created by virgil wang on 2019/7/9.
// Copyright © 2019 virgil wang. All rights reserved.
//
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 1010;
int m, n;
int data[maxn][maxn];
void writenum(int rl, int rh, int cl, int cr, int num)
{
if(rl > rh || cl > cr)
{
return;
}else{
for(int i = cl; i <= cr; i++)
{
data[rl][i] = num++;
}
for(int i = rl + 1; i <= rh; i++)
{
data[i][cr] = num++;
}
for(int i = cr - 1; i >= cl; i--)
{
data[rh][i] = num++;
}
for(int i = rh - 1; i >= rl + 1; i--)
{
data[i][cl] = num++;
}
writenum(rl + 1, rh - 1, cl + 1 , cr - 1, num);
}
}
int main(int argc, char *argv[]) {
scanf("%d%d", &m, &n);
writenum(1, m, 1, n, 1);
for(int i = 1; i <= m; i++)
{
for(int j = 1; j <= n; j++)
{
printf("%d ", data[i][j]);
}
printf("\n");
}
}