每日刷题(四十一)
BASIC-25、回形取数
其实这个题和螺旋填数很类似,只是方向不同罢了
这里我先分析一下螺旋填数
这是我的思路,根据题意,先遍历第0列,我的方式是每次都遍历到“底”,何谓“底”,就是矩阵的边界,这样就能保证都不漏,也可以保证每一环节的依赖性,如果前面没有遍历,那么之后的步骤都不能走,可以达到输出正确的目的。所以我设置了标识符flag,用完一次flag就使它失效(赋值为0),如果这一环节的遍历能进行,则重新激活flag(赋值为1)
我需要设下边界、右边界和上边界,为何不设置左边界,那是因为我外层遍历就是j(列数),j就是左边界
详细C代码如下:
#include<stdio.h>
int main()
{
int m, n;
scanf("%d %d", &m, &n);
int a[m][n];
int i, j;
for(i = 0; i < m; i++)
{
for(j = 0; j < n; j++)
{
scanf("%d", &a[i][j]);
}
}
int u = m, v = n, w = 0; //u为下边界,v为右边界,w为上边界
int t, k, h;
int flag = 1;
for(j = 0; j <= n / 2; j++) //列不变行变
{
if(flag)
{
flag = 0;
for(i = w; i < u; i++)
{
printf("%d ", a[i][j]);
flag = 1;
}
if(flag)
{
flag = 0;
i -= 1;
for(t = j + 1; t < v; t++) //行不变列变
{
printf("%d ", a[i][t]);
flag = 1;
}
if(flag)
{
flag = 0;
t -= 1;
for(k = i - 1; k >= w; k--) //列不变行变
{
printf("%d ", a[k][t]);
flag = 1;
}
if(flag)
{
flag = 0;
k += 1;
for(h = t - 1; h >= j + 1; h--) //行不变列变
{
printf("%d ", a[k][h]);
flag = 1;
}
}
}
}
}
w++;
u--;
v--;
}
printf("\b");
return 0;
}
Python版螺旋填数解法
import numpy as np
m = int(input('Please enter row:'))
n = int(input('Please enter column:'))
c = np.arange(1, m * n + 1)
c.shape = (m, n)
digit = 0
p = 1
for q in range(int(m / 2)):
for i in range(q, n - q):
digit = digit + 1
c[q][i] = digit
for j in range(q + 1, m - q):
digit = digit + 1
c[j][i] = digit
for k in range(q + 1, n - q):
digit = digit + 1
c[j][n - k - 1] = digit
for t in range(m - (q + 1) * 2):
digit = digit + 1
c[m - (q + 1) - 1 - t][q] = digit
if n % 2 == 1:
c[int(m / 2)][q + 1] = digit + 1