题目链接:点击打开链接
来源:湖南文理学院OJ
题目描述:给你一个整数N,要求输出对应的矩阵
输入描述:
N
数据范围
1≤N≤500
输出描述:
一个N*N的矩阵
示例1:
输入:
4
输出:
1 8 7
2 9 6
3 4 5
示例2:
输入:
4
输出:
1 12 11 10 2 13 16 9 3 14 15 8 4 5 6 7
题目分析:由案例可以看出矩阵的走势,所以只需要创一个方向矩阵即可,具体操作看代码。
#include <stdio.h>
#include <stdlib.h>
int b[501][501];
int main()
{
int next[4][2]={{1,0},{0,1},{-1,0},{0,-1}};//方向矩阵向下走,向右走,向上走,向下走。
int N,x=0,y=1,tx,ty,i,j,a=1,flag;
scanf("%d",&N);
for(i=1; i<=N*N; i++)
{
flag=0;
for(j=0; j<4; j++)
{
if(tx==a&&ty!=a)//当tx==a&&ty!=a时说明是第二次到a行此时需要一直往左边走
{
if(ty==a+1)//此时在左边已经走过后一个位置
{
a++;//为下一行做准备
i--;//此时j=0,却并没有往下走所以在当前循环中i并不会填入b数组
}
else
{
tx=x;
ty=y-1;//往左边走
}
}
else//下,右,上,左遍历。
{
tx=x+next[j][0];
ty=y+next[j][1];
}
if(b[tx][ty]==0&&tx>0&&tx<=N&&ty>=0&&ty<=N)//判断tx,ty位置是否已经有数,以及走第一层时是是否越界
{
b[tx][ty]=i;
flag=1;
break;
}
}
if(flag==1)//只有填了数时x,y才改变。
{
x=tx;
y=ty;
}
}
for(i=1; i<=N; i++)
{
for(j=1; j<=N; j++)
{
if(j!=N)
printf("%d ",b[i][j]);
else
printf("%d\n",b[i][j]);
}
}
return 0;
}