闲的无聊翻到老早的草稿纸上有乱画的螺旋矩阵的算法,虽然已过了纠结算法的时候,写出来打发时间吧,短短五十行代码,么想到也耗了一下午时间。算法部分不过一个switch,有效语句不过十几行。变量名注释都很清楚,有需要的可以瞧瞧。也瞧过网上其他人的,太复杂。
思路:开始也按网上的二维数组思路,越搞越复杂,理不清头绪。吃了两袋口水娃,豁然开朗,这不就是一条盘起来的shit吗?明明是一维数组,这样一来就简单了。只要将这条shit每盘一节转个方向就好了,所以一个循环就搞定了。
//////////////////////////////////////////////////////////////////////////
//螺旋矩阵
//////////////////////////////////////////////////////////////////////////
#include
#include
int main(int argc, char argv[])
{
const int _Max_M = 15;//行
const int _Max_N = 10;//列
int array[_Max_M][_Max_N] = {0}, begin = 1, i = 0, j = 0, left = 0, top =0, right = _Max_N-1, bottom = _Max_M-1;
int direction = 0;//0右,1下,2左,3上
for (int data = begin; data <= begin+_Max_N*_Max_M-1; ++data)
{
array[i][j] = data;
printf("[%d][%d]=%d\t", i, j,array[i][j]);//过程打印
if(!(data%5))std::cout<<"\n";
switch (direction)
{
case 0:
++j;
if(j == right){
direction = ++direction%4;
--right;
}
break;
case 1:
++i;
if(i == bottom){
direction = ++direction%4;
--bottom;
}
break;
case 2:
--j;
if(j == left){
direction = ++direction%4;
++left;
}
break;
case 3:
--i;
if(i-1 == top){
direction = ++direction%4;
++top;
std::cout<<"\n\n";
}
break;
}
}
std::cout<<"\n=============================================\n"<
结果
