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