目录👀👀👀
💌💌💌💌💌💌💌💌💌💌💌💌💌💌💌欢迎光临:
一,蛇形方阵之非回字型
🎶以4*4矩阵为例,开始找规律
1 3 4 10 2 5 9 11 6 8 12 15 7 13 14 16
n为4 前数坐标 后数坐标 1,16 (1,1) (4,4) 2,15 (2,1) (3,4) x1+x2=n+1;
y1+y2=n+1;now从1开始,每到新的位置就++;
像这种我们就可以利用规律只循环一半(考虑到奇数)使用
while(now<n*n/2-1)
{ a[x][y] = now;
a[n + 1 - x][n + 1 - y] = n * n + 1 - now;...
}
#include<stdio.h>
int main()
{
int n = 0;
scanf_s("%d", &n);
int a[10][10] = { 0 };
int x = 1, y = 1;
int way = 0,now=1;
while (now <= n * n / 2 + 1)
{
a[x][y] = now;
a[n + 1 - x][n + 1 - y] = n * n + 1 - now;
now++;
if (way == 0)//1wei右上
{
x++;
y--;
}
else
{
x--;
y++;
}
if (x == 0)
{
x = 1;
way = 0;
}
else if (y == 0)
{
y = 1;
way = 1;
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
printf("%5d ", a[i][j]);
}
printf("\n");
}
return 0;
}
输出样例:
💞 tip
👀如果想要这个矩阵的转置,可把while前面的int way=0的 0 改为 1。
二,蛇形矩阵之回型矩阵
暴力解法就是从右->下->左->上依次循环,耗时长;
此处采用偏移量解法💕
🎶
#include<stdio.h>
int main()
{
int a[20][20] = { 0 };
int n, m;
scanf("%d %d", &n, &m);
int dx[] = { -1,0,1,0 }, dy[] = { 0,1,0,-1 };
int x = 0, y = 0, d = 1;//让d先等于1,先向右边走
for (int i = 1; i <= n * m; i++)
{
a[x][y] = i;
int p = x + dx[d], q = y + dy[d];
if (p < 0 || p >= n || q<0 || q>=m || a[p][q])//开始换方向
{
d = (d + 1) % 4;
p = x + dx[d], q = y + dy[d];
}
x = p;
y = q;
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
printf("%2d ", a[i][j]);
}
printf("\n");
}
return 0;
}
附上输入 3 4的结果图,但是我也不知道为啥这个写法在vs编译器竟然连输入的机会都不给我哈哈哈哈,最后是在pta的gcc编译器中测试的。😅
💞summary:
本来以为是简单题,结果发现自己能力根本达不到,只能慢慢积累,慢慢提高自己的思维,
原来矩阵也是需要找到恰到好处的规律的,寒假加油伙伴们,共同进步!👣