螺旋矩阵算法

来源:互联网 发布:51单片机晶振电路原理 编辑:程序博客网 时间:2024/05/07 06:51

这个问题看似很难,但是其实只有有了正确的,规范的逻辑思想算法以后(就像看了这个算法以后),感觉其实这个问题很简单,于是我们不但要学习高深的算法,还要掌握一流的逻辑思维理念。这个算法值得我们学习的地方就是他的数学建模思想,把复杂的问题抽象出来,成为了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;
 }
}
 

原创粉丝点击