#include
#include <stdio.h>
int main(void)
{
//用户输入的值,创建n*n的矩阵
int n;
//蛇形从1开始计数
int count = 1;
//a[x][y],x是二维数组的第一个下标,y是第二个。
//round是蛇形矩阵的第几圈,从0开始。
int x,y,round;
scanf(“%d”,&n);
int (*a)[n] = calloc(n*n,sizeof(int));
//如果n是1,则直接输出。
if(n == 1){
a[0][0] = count;
}else{
//下面以n=5为例
//一共有2(5/2)圈蛇形
for(round=0; round<n/2; round++){
/* 以下循环执行后输出如下:
1 2 3 4 5
*/
x = round;
for(y=round;y<n-round;y++){
a[x][y]=count;
count++;
}
/* 以下循环执行后输出如下:
1 2 3 4 5
6
7
8
*/
y = n – round – 1;
for(x=round+1;x<n-round-1;x++){
a[x][y]=count;
count++;
}
/* 以下循环执行后输出如下:
1 2 3 4 5
6
7
8
13 12 11 10 9
*/
x = n – round – 1;
for(y=n-round-1;y>=round;y–){
a[x][y]=count;
count++;
}
/* 以下循环执行后输出如下:
1 2 3 4 5
16 6
15 7
14 8
13 12 11 10 9
*/
y = round;
for(x=n-round-1-1;x>round;x–){
a[x][y]=count;
count++;
}
}
/* 上面的大循环执行后输出如下:
1 2 3 4 5
16 17 18 19 6
15 24 20 7
14 23 22 21 8
13 12 11 10 9
*/
if(n%2 == 1){
//如果n值奇数,将最中间的空填上
a[n/2][n/2] = count;
}
}
//打印矩阵
for(x=0;x<n;x++){
for(y=0;y<n;y++){
printf(“%d “,a[x][y]);
}
printf(“\n”);
}
printf(“\n”);
free(a);
return 0;
}
一个蛇形数组的题目,编程输出如下类似的蛇形矩阵
1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16
#include<iostream>
using namespace std;
#define N 15
int mat[N][N];
int all;
void getLayer(int x,int y) //根据下标的规律,一层一层输出
{
int a=y,b=x;
mat[x][y]=all++;
if(x>a) {
while(x!=a) {
x–;
y++;
mat[x][y]=all++;
}
}else{
while(x!=a){
x++;
y–;
mat[x][y]=all++;
}
}
}
void changeLayer(int x,int y) //每次输出一层,则转下一层
{
while(x<=N-1&&y<=N-1){
if(x<N-1&&y==0)
x++;
else if(x==0&&y<N-1)
y++;
else if(x==N-1&&y<N-1)
y++;
else if(x<N-1&&y==N-1)
x++;
getLayer(x,y);
if(x==N-1&&y==N-1)
break;
int tmp=x;
x=y;
y=tmp;
}
}
int main()
{
mat[0][0]=1;
mat[0][1]=2;
mat[1][0]=3;
all=4;
changeLayer(1,0);
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
cout<<mat[i][j]<<” “;
cout<<endl;
}
return 0;
}