所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。
输入格式:
输入在一行中给出一个正整数N(<10)。
输出格式:
输出N×N的螺旋方阵。每行N个数字,每个数字占3位。
输入样例:
5
输出样例:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
#include<stdio.h>
#define N 10
int main(){
int n,arr[N][N];
//根据题目输出方阵故创建二维数组来操作
scanf("%d",&n);
int x=0,y=0;//以左上角为坐标原点开始设立坐标
int turn_up=1,turn_lower=n-1,turn_left=0,turn_right=n-1;
//这是整个图形的边界,同时每转一圈后将边界缩小1
int direction=0;//0为向右,1为向下,2为向左,3为向上
int count=1;//循环次数为n的平方,同时作为输出内容从1到n的平方
while(count<=n*n){
if(direction==0)//如果是向右走
{
arr[y][x++]=count++;//横坐标+1,计数+1
if(x==turn_right)//如果向右走遇到右边界
{
direction=1;//改变方向,向下走
turn_right--;//右边界-1
}
}else if(direction==1)//如果是向下走
{
arr[y++][x]=count++;//纵坐标+1,计数+1
if(y==turn_lower)//向下走遇到下边界
{
direction=2;//改变方向,向左走
turn_lower--;//下边界-1
}
}else if(direction==2)//如果是向左走
{
arr[y][x--]=count++;//横坐标-1,计数+1
if(x==turn_left)//向左走遇到左边界
{
direction=3;//改变方向,向上走
turn_left++;//左边界+1
}
}else if(direction==3)//如果是向上走
{
arr[y--][x]=count++;//纵坐标-1,计数+1
if(y==turn_up)//向上走遇到上边界
{
direction=0;//改变方向,向右走
turn_up++;//上边界+1
}
}
}//二维数组安排结束,统一格式输出
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("%3d",arr[i][j]);
}printf("\n");
}
}
特别容易出错的就是设置上界的时候一定要设置为1!!!因为是从第一行开始循环的!!!
By_Suki