1.起点在左上角的蛇形矩阵
如果int[N][N]={};有问题(编译器不支持这种初始化为0的方法),就用两个循环来时使二维数组的每个数初始化为0。
(1)做围栏防止出界
#include <stdio.h>
#define right 1
#define down 2
#define left 3
#define up 4
main(void)
{
int N, direct = right, x = 1, y = 1 ;
printf("输入你要打印的N×N矩阵的N(N为奇数):\n") ;
scanf("%d", &N) ;
int a[N+2][N+2] ={} ;
for (int i = 0 ; i < N+2 ; i++)
for (int j = 0 ; j < N+2 ; j++)
{
if (0 == i || N+1 == i || 0 == j || N+1 == j)
a[i][j] = -1 ;
}
for (int i = 1 ; i <= N*N ; i++)
{
a[x][y] = i ;
switch (direct)
{
case right :
if (a[x][y+1] != 0)
{
direct = down ;
x++ ;
}
else
y++ ;
break ;
case down :
if (a[x+1][y] != 0)
{
direct = left ;
y-- ;
}
else
x++ ;
break ;
case left :
if (a[x][y-1] != 0)
{
direct = up ;
x-- ;
}
else
y-- ;
break ;
case up :
if (a[x-1][y] != 0)
{
direct = right ;
y++ ;
}
else
x-- ;
break ;
}
}
for (int i = 1 ; i < N+1 ; i++)
{
for (int j = 1 ; j < N+1 ; j++)
printf("%-4d", a[i][j]) ;
printf("\n") ;
}
}
(2)用 if语句 防止出界
注: 二维数组一维角标出界,编译器会把它当一维数组使用
①顺时针
#include <stdio.h>
#define right 1
#define down 2
#define left 3
#define up 4
void main(void)
{
int N, direct = right, x = 0, y = 0 ;
printf("输入你要打印的N×N矩阵的N:\n") ;
scanf("%d", &N) ;
int a[N][N] ={} ;
for (int i = 1 ; i <= N*N ; i++)
{
a[x][y] = i ;
switch (direct)
{
case right :
if (a[x][y+1] != 0 || y > N-2)
{
direct = down ;
x++ ;
}
else
y++ ;
break ;
case down :
if (a[x+1][y] != 0 || x > N-2)
{
direct = left ;
y-- ;
}
else
x++ ;
break ;
case left :
if (a[x][y-1] != 0)
{
direct = up ;
x-- ;
}
else
y-- ;
break ;
case up :
if (a[x-1][y] != 0)
{
direct = right ;
y++ ;
}
else
x-- ;
break ;
}
}
for (int i = 0 ; i < N ; i++)
{
for (int j = 0 ; j < N ; j++)
printf("%-4d", a[i][j]) ;
printf("\n") ;
}
}
②逆时针
#include <stdio.h>
#define right 1
#define down 2
#define left 3
#define up 4
main(void)
{
int N, direct = down, x = 0, y = 0 ;
printf("输入你要打印的N×N矩阵的N(N为奇数):\n") ;
scanf("%d", &N) ;
int a[N][N] ={} ;
for (int i = 1 ; i <= N*N ; i++)
{
a[x][y] = i ;
switch (direct)
{
case right :
if (a[x][y+1] != 0)
{
direct = up ;
x-- ;
}
else
y++ ;
break ;
case down :
if (a[x+1][y] != 0)
{
direct = right ;
y++ ;
}
else
x++ ;
break ;
case left :
if (a[x][y-1] != 0)
{
direct = down ;
x++ ;
}
else
y-- ;
break ;
case up :
if (a[x-1][y] != 0 || x < 1)
{
direct = left ;
y-- ;
}
else
x-- ;
break ;
}
}
for (int i = 0 ; i < N ; i++)
{
for (int j = 0 ; j < N ; j++)
printf("%-4d", a[i][j]) ;
printf("\n") ;
}
}
2.起点在中间的蛇形矩阵
(1)最大值在左上角
①顺时针
#include <stdio.h>
#define right 1
#define down 2
#define left 3
#define up 4
main(void)
{
int N, direct = down, x = 0, y = 0 ;
printf("输入你要打印的N×N矩阵的N(N为奇数):\n") ;
scanf("%d", &N) ;
int a[N][N] ={} ;
for (int i = N*N ; i > 0 ; i--)
{
a[x][y] = i ;
switch (direct)
{
case right :
if (a[x][y+1] != 0)
{
direct = up ;
x-- ;
}
else
y++ ;
break ;
case down :
if (a[x+1][y] != 0)
{
direct = right ;
y++ ;
}
else
x++ ;
break ;
case left :
if (a[x][y-1] != 0)
{
direct = down ;
x++ ;
}
else
y-- ;
break ;
case up :
if (a[x-1][y] != 0 || x < 1)
{
direct = left ;
y-- ;
}
else
x-- ;
break ;
}
}
for (int i = 0 ; i < N ; i++)
{
for (int j = 0 ; j < N ; j++)
printf("%-4d", a[i][j]) ;
printf("\n") ;
}
}
②逆时针
#include <stdio.h>
#define right 1
#define down 2
#define left 3
#define up 4
main(void)
{
int N, direct = right, x = 0, y = 0 ;
printf("输入你要打印的N×N矩阵的N(N为奇数):\n") ;
scanf("%d", &N) ;
int a[N][N] ={} ;
for (int i = N*N ; i > 0 ; i--)
{
a[x][y] = i ;
switch (direct)
{
case right :
if (a[x][y+1] != 0 || y > N-2)
{
direct = down ;
x++ ;
}
else
y++ ;
break ;
case down :
if (a[x+1][y] != 0 || x > N-2)
{
direct = left ;
y-- ;
}
else
x++ ;
break ;
case left :
if (a[x][y-1] != 0)
{
direct = up ;
x-- ;
}
else
y-- ;
break ;
case up :
if (a[x-1][y] != 0)
{
direct = right ;
y++ ;
}
else
x-- ;
break ;
}
}
for (int i = 0 ; i < N ; i++)
{
for (int j = 0 ; j < N ; j++)
printf("%-4d", a[i][j]) ;
printf("\n") ;
}
}
(2)最大值在右下角
①顺时针类似上面
②逆时针
#include <stdio.h>
#define right 1
#define down 2
#define left 3
#define up 4
main(void)
{
int N, direct = left ;
printf("输入你要打印的N×N矩阵的N(N为奇数):\n") ;
scanf("%d", &N) ;
int x = N-1, y = N-1, a[N][N] ={} ;
for (int i = N*N ; i > 0 ; i--)
{
a[x][y] = i ;
switch (direct)
{
case right :
if (a[x][y+1] != 0)
{
direct = down ;
x++ ;
}
else
y++ ;
break ;
case down :
if (a[x+1][y] != 0)
{
direct = left ;
y-- ;
}
else
x++ ;
break ;
case left :
if (a[x][y-1] != 0 || y < 1)
{
direct = up ;
x-- ;
}
else
y-- ;
break ;
case up :
if (a[x-1][y] != 0 || x < 1)
{
direct = right ;
y++ ;
}
else
x-- ;
break ;
}
}
for (int i = 0 ; i < N ; i++)
{
for (int j = 0 ; j < N ; j++)
printf("%-4d", a[i][j]) ;
printf("\n") ;
}
}
其他情况类似上面