2007-08-23

    螺旋矩阵算法 - [Algorithms]

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://conoon.blogbus.com/logs/7872528.html

    这个问题看似很难,但是其实只有有了正确的,规范的逻辑思想算法以后(就像看了这个算法以后),感觉其实这个问题很简单,于是我们不但要学习高深的算法,还要掌握一流的逻辑思维理念。这个算法值得我们学习的地方就是他的数学建模思想,把复杂的问题抽象出来,成为了4个方向的结构式模块组合,于是复杂的问题就简单化了!!! 这个问题看似很难,但是其实只有有了正确的,规范的逻辑思想算法以后(就像看了这个算法以后),感觉其实这个问题很简单,于是我们不但要学习高深的算法,还要掌握一流的逻辑思维理念。这个算法值得我们学习的地方就是他的数学建模思想,把复杂的问题抽象出来,成为了4个方向的结构式模块组合,于是复杂的问题就简单化了!!!
    #include <iostream>
    #include <iomanip>
    using namespace std;
    void right();          //向左输入的赋值函数
    void down();
    void left();
    void up();
    void show();          //显示函数
    void sort();          //控制方向的函数
    int value;  
                     
    int direction = 0;     //控制方向
    int rightNum = 0;      //向右输入一行的次数
    int downNum = 0;    
    int leftNum = 0;  
    int upNum = 0;      
    int arrayNum = 0;       //自增赋值数
    int row = 0;           //保存行下标
    int col =0;            //保存列下标
    int array[100][100];    //保存数组
    int main(int argc, char *argv[])
    {
     cout<<"N*N, enter N:"<<endl;
     cin>>value;
      
     sort();
     show();
     system("pause");
     return 0;
    }

    void sort()
    {
     while(arrayNum != value*value)   //循环跳出条件,赋值完毕
     {
      switch(direction)
      {
      case 0:
       right(); 
       break;
      case 1:
       down(); 
       break;
      case 2:
       left(); 
       break;
      case 3: 
       up(); 
       break;
      default:
       break;
      }
     }
     return;
    }
    void right()
    {
     int m = row;
     int n = col;
     if(m==0&&n==0)
     {
      array[m][n] = ++arrayNum;
     }
     for(int i=n+1; i<value-rightNum;i++)
     {
      array[m][i] = ++arrayNum;
      n++;
     }
     row=m;
     col=n;
     rightNum++;
     direction = 1;
     return;
    }
    void down()
    {
     int m = row;
     int n = col;
     for(int i=m+1; i<value-downNum;i++)
     {
      array[i][n] = ++arrayNum;
      m++;
     }
     row=m;
     col=n;
     downNum++;
     direction = 2;
     return;
    }
    void left()
    {
     int m = row;
     int n = col;
     for(int i=n-1; i>=leftNum;i--)
     {
      array[m][i] = ++arrayNum;
      n--;
     }
     row=m;
     col=n;
     leftNum++;
     direction = 3;
     return;
    }
    void up()
    {
     int m = row;
     int n = col;
     for(int i=m-1; i>upNum; i--)
     {
      array[i][n] = ++arrayNum;
      m--;
     }
     row=m;
     col=n;
     upNum++;
     direction = 0;
     return;
    }
    void show()
    {
     int n =0;
     for(int i=0; i<value; i++)
     {
      for(int j=0; j<value; j++)
      {
       cout<<setw(value)<<array[i][j];
      }
      cout<<endl;
     }
    }


    收藏到:Del.icio.us




    Tag:
    引用地址:

发表评论

您将收到博主的回复邮件
记住我