螺旋矩阵算法

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值