77 螺旋方阵

问题描述 :

明明在上学的时候,参加数学兴趣班。在班上,老师介绍了一种非常有趣的方阵,称之为螺旋方阵。该方阵一共由n×n个正整数构成(我们称之为n阶螺旋方阵),即共有n行n列。

方阵中的数字从1开始递增,数字的排序规则是从左上角出发由1开始排序,并按顺时针方向旋进,即先排最外面的一圈,然后排里面的一圈,以此类推,直到排到最后一个数为止。

例如一个4阶的螺旋方阵,一共有4×4=16个正整数构成,数字从1递增到16,最后排出来的方阵如下:

 1  2  3  4

12 13 14  5

11 16 15  6

10  9  8  7

明明回家后想自己动手构造这样的螺旋方阵。他从n=1开始构造,但是他发现当n越来越大时,螺旋方阵的复杂性就越高,然后构造出来的方阵就越容易出错。为了降低构造方阵的出错率,提高构造速度,明明就求助于你,请你帮他写一个程序,来构造螺旋方阵。 明明的问题可以归结为:给你一个正整数n,请你按题目描述中所述的方法,构造出n阶的螺旋方阵。

输入说明 :

你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅占一行,每行仅有一个正整数n(1≤n≤10),即所要构造的螺旋方阵的阶数。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。

输出说明 :

对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一个n阶的螺旋方阵,方阵中的数字用一个空格隔开,具体形式请参考输出样例。每组运算结果与其后一组运算结果之间有一个空行,最后一组运算结果之后没有空行。 注:通常,显示屏为标准输出设备。

输入范例 :

9
4

输出范例 :

1 2 3 4 5 6 7 8 9
32 33 34 35 36 37 38 39 10
31 56 57 58 59 60 61 40 11
30 55 72 73 74 75 62 41 12
29 54 71 80 81 76 63 42 13
28 53 70 79 78 77 64 43 14
27 52 69 68 67 66 65 44 15
26 51 50 49 48 47 46 45 16
25 24 23 22 21 20 19 18 17

1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7

 

思想:记录一个当前矩阵起始行列和终止行列的数据,每当遍历数字位于[0][0]、[1][1].....的时候,就缩减循环位置,进入内圈,col++,row--,然后判断位置,确定数字的前进位置。

复制代码
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int row, i, j, k, count;
    while (scanf("%d", &row) != EOF)
    {   
        int count =0;
        int x = 0, y = 0;
        int pos[row][row]; //初始化矩阵
        int CRow = row;
        int Col = 0;
        for (i = 0; i < row; i++)
        {
            for (j = 0; j < row; j++)
            {
                pos[i][j] = 0;
            }
        }
        for (i = 1; i <= row * row; i++)
        {
            pos[x][y] = i;
            if (x==count&&y==count)  //当经过[0][0]、[1][1]等位置的时候
            {
                count++;
                CRow--;
                Col++;
            }
            if (x == Col - 1 && y < CRow)  //最上面一行 向右
            {
                y++;
            }
            else if (x == Col - 1 && y == CRow) //右上角 转向下
            {
                x++;
            }
            else if (y == CRow && x < CRow) //最右一列 向下
            {
                x++;
            }
            else if (y == CRow && x == CRow) //右下角 转向左
            {
                y--;
            }
            else if (x == CRow && y > Col - 1) //最下面一行 
            {
                y--;
            }
            else if (x == CRow && y == Col - 1) //左下角 转向上
            {
                x--;
            }
            else if (y == Col - 1 && x > Col) //最左一列 向上
            {
                x--;
            }
            else if (y == Col - 1 && x == Col)  //转进内圈 向右
            {
                y++;
            }else{              //如果最后一位数是内圈向左的情况
                y--;
            }
        }
        for (i = 0; i < row; i++)
        {
            printf("%d", pos[i][0]);
            for (j = 1; j < row; j++)
            {
                printf(" %d", pos[i][j]);
            }
            printf("\n");
        }
         printf("\n");
    }
}
复制代码

 

 

 

posted @   梦想是能睡八小时的猪  阅读(155)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示