题目内容:
一个从里向外逆时针转出来的螺旋n*n的矩阵 输
输入描述
矩阵的规模,0~50,如5表示5行5列的矩阵
输出描述
矩阵的规模,0~50,如5表示5行5列的矩阵,每个数占5位
输入样例
5
输出样例
25 24 23 22 21
10 9 8 7 20
11 2 1 6 19
12 3 4 5 18
一个从里向外逆时针转出来的螺旋n*n的矩阵 输
输入描述
矩阵的规模,0~50,如5表示5行5列的矩阵
输出描述
矩阵的规模,0~50,如5表示5行5列的矩阵,每个数占5位
输入样例
5
输出样例
25 24 23 22 21
10 9 8 7 20
11 2 1 6 19
12 3 4 5 18
13 14 15 16 17
分析:首先要确定1的位置,根据总结,得出1的y坐标等于n/2,1的x坐标不确定,然后就是设置旋转了这个分析起来有点晕,看了一会儿后会发现,首先是每次填写数字都有左下右上这么四个过程,而且之后就是这四个过程的重复,而且每次一条线上的数据的长度都在增加,这样就好说了
#include<stdio.h>
#define M 51
int main()
{
int a[M][M] = {0},b[M][2];
int i,j,x,y,p = 1,q = 1,m = 1,k,l,r,s,t;
int n;
int flag = 0,flagg = 1;;
b[0][0] = 0;
b[0][1] = 1;
scanf("%d",&n);
for(i = 1;i <= n; i++)
{
if(flag%2 == 0)
{
b[i][0] = b[i - 1][0] + 1;
b[i][1] = b[i - 1][1];
}
if(flag%2 == 1)
{
b[i][0] = b[i - 1][0];
b[i][1] = b[i - 1][1] + 1;
}
flag++;
}
for(i = 0;i < M; i++)
if(i + 2 == n)
{
x = b[i][0];
y = b[i][1];
}
t = x;
s = y;
while(m <= n*n)
{
for(j = s;j >= s - p; j--)
{
a[t][j] = m;
m++;
}
for(k = t + 1;k <= t + q; k++)
{
a[k][j + 1] = m;
m++;
}
p++;
q++;
for(l = j + 2;l <= j + p; l++)//坑爹的l = j + 2,我开始一直用j + 1,老是有问题,看来细心真的很重要啊
{
a[k - 1][l] = m;
m++;
}
for(r = k - 1;r >= k - q; r--)
{
a[r][l] = m;
m++;
}
p++;
q++;
s = l;
t = r;
}
for(i = 0;i < n; i++)
{
for(j = 0;j < n; j++)
{
if(j == 0)
printf("%d",a[i][j]);
else
printf("%5d",a[i][j]);
}
//putchar('\n');
printf("\n");
}
return 0;
}