海龟算法求解螺旋方阵

【题目描述】
所谓“螺旋方阵”,是指对任意给定的N,将1到N*N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入NxN的方阵里。本题要求构造这样的螺旋方阵。

【输入】

输入在一行中给出一个正整数N(<10)。

【输出】

输出NxN的螺旋方阵。每行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

参照海龟行走的做法,用一对变量AB模拟海龟头的方向,根据屏幕坐标的特点,AB的取值和海龟头方向有这样的关系:(0,1)表示向右;(0, -1)表示向左;(-1,0)表示向上;(1,0)表示向下;用另一对变量XY模拟海龟位置,海龟每前进一步,它的新位置即为X=X+AY=Y+B;要海龟向右转,就改变AB的值,根据direction的值用switch改变。下面用自然语言对算法进行描述:让海龟先走n步,然后右转,再走n-1步,再右转,再走n-1步,再右转,再走n-2步,再右转,再走n-2……如此类推,直到海龟前进的步数为0时停止;而每当海龟前进1步,就在它位置上显示一个数字,那么前进n步即重复执行“X=X+AY=Y+B”语句n次。但如何让下两个循环的重复次数都为n-1呢?解决的方法是:循环n次后,让n的值减少0.5,然后再转回执行同样的循环。

My program

#include <stdio.h>
#include <stdlib.h>
#define N 10
int main(void)
{
    int count = 1;            //数组中该存的值
    double n;                 //控制循环次数
    int matrix[N][N];
    int i, j;                 //输出数组
    int direction = 0;
    int a, b;                 //用于数组改变方向
    int x = 0, y = -1;        //数组的下标
    int temp;
    scanf("%lf", &n);
    temp = n;
    while(n)
    {
        switch(direction)    // direction指示方向, 0向右, 1向下, 2向左, 3向上
        {
        case 0:
            a = 0;
            b = 1;
            break;
        case 1:
            a = 1;
            b = 0;
            break;
        case 2:
            a = 0;
            b = -1;
            break;
        case 3:
            a = -1;
            b = 0;
            break;
        }


        for(i=n; i>0; i--)
        {
            x = x+a;
            y = y+b;
            matrix[x][y] = count;
            count++;
        }
    direction += 1;
    direction %= 4;
    n -= 0.5;
    }
    for(i=0; i<temp; i++)
    {
        for(j=0; j<temp; j++)
        {
            printf("%3d", matrix[i][j]);
        }
        printf("\n");
    }
    return 0;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值