• 螺旋矩阵算法


    最近看到博客里有人介绍螺旋矩阵,忍不住啊~

    以下面的4*4螺旋矩阵为例

    1  2  3    4

    12  13   14  5

    11  16   15  6

    10  9   8   7

    我们可以理解为一个二维数组,从四个方向(从左至右,从上至下,从右至左,从下至上)依次递增赋值(超出数组边界或遇到已赋值的数组元素则改变赋值方向,直至完成全部数组元素的赋值)。

    初始时,赋值方向为从左至右:

        /*
         * 0 turn right
         * 1 turn down
         * 2 turn left
         * 3 turn up
         */
        int dir = 0;

    改变赋值方向:

    dir = (dir + 1)%4;

    全部代码如下:

    ///////////////////////////////////////////////////////////
    // Copyright (c) 2013, ShangHai xxxx Inc.
    //
    // FileName: spiralmatrix-2.cpp
    //
    // Description:
    //
    // Created: 2013年10月13日 星期日 19时42分47秒
    // Revision: Revision: 1.0
    // Compiler: g++
    //
    ///////////////////////////////////////////////////////////
    #include <stdio.h>
    #include <string.h>
    
    const int MAX_SIZE = 10;
    
    int main()
    {
        int array[MAX_SIZE][MAX_SIZE];
        memset(array, 0, sizeof(array));
    
        int x = 0;
        int y = 0;
        int totalStep = MAX_SIZE*MAX_SIZE;
    
        /*
         * 0 turn right
         * 1 turn down
         * 2 turn left
         * 3 turn up
         */
        int dir = 0;
    
        int count = 1;
        while(1)
        {
            array[x][y] = count;
    
            if(0 == dir)
            {
                if( ( (y+1) == MAX_SIZE) || (array[x][y+1] != 0) )
                {
                    dir = (dir+1)%4;
                    x = x + 1;
                }
                else
                {
                    y = y + 1;
                }
    
            }
            else if(1 == dir)
            {
                if( ( (x+1) == MAX_SIZE) || (array[x+1][y] != 0) )
                {
                    dir = (dir + 1)%4;
                    y = y -1;
                }
                else
                {
                    x = x + 1;
                }
            }
            else if(2 == dir)
            {
                if( ( (y-1) < 0) || (array[x][y-1] != 0) )
                {
                    dir = (dir + 1)%4;
                    x = x - 1;
                }
                else
                {
                    y = y - 1;
                }
            }
            else if(3 == dir)
            {
                if( ( (x-1) < 0) || (array[x-1][y] != 0) )
                {
                    dir = (dir + 1)%4;
                    y = y + 1;
                }
                else
                {
                    x = x - 1;
                }
            }
    
            //break or add moveStep
            if(count == totalStep)
                break;
            else
                count++;
        }
    
        //print
        for(int i = 0; i < MAX_SIZE; i++)
        {
            for(int j = 0; j < MAX_SIZE; j++)
                printf("%3d", array[i][j]);
            printf("
    ");
        }
    
        return 0;
    }

    结果如下:

    ./spiralmatrix-2 
      1  2  3  4  5  6  7  8  9 10
     36 37 38 39 40 41 42 43 44 11
     35 64 65 66 67 68 69 70 45 12
     34 63 84 85 86 87 88 71 46 13
     33 62 83 96 97 98 89 72 47 14
     32 61 82 95100 99 90 73 48 15
     31 60 81 94 93 92 91 74 49 16
     30 59 80 79 78 77 76 75 50 17
     29 58 57 56 55 54 53 52 51 18
     28 27 26 25 24 23 22 21 20 19
  • 相关阅读:
    [转] DBus学习(一):总体介绍
    [转] DBus学习(四):基础小例子(同步和异步)
    linux系统调用列表
    Quantum Espresso + Phonopy 计算声子过程
    Compile Quantum Espresso (QE)
    Ubuntu 14.04 下创建 svn repository
    Python import 模块导入问题
    修改Ubuntu下ssh登陆时的欢迎信息
    ORNL cadesvirtues上编译 RMG/ Compile RMG on Cadesvirtues at ORNL
    launch images source启动图删除后上下有黑边
  • 原文地址:https://www.cnblogs.com/yangtze736-2013-3-6/p/3367197.html
Copyright © 2020-2023  润新知