闲的无聊翻到老早的草稿纸上有乱画的螺旋矩阵的算法,虽然已过了纠结算法的时候,写出来打发时间吧,短短五十行代码,么想到也耗了一下午时间。算法部分不过一个switch,有效语句不过十几行。变量名注释都很清楚,有需要的可以瞧瞧。也瞧过网上其他人的,太复杂。

思路:开始也按网上的二维数组思路,越搞越复杂,理不清头绪。吃了两袋口水娃,豁然开朗,这不就是一条盘起来的shit吗?明明是一维数组,这样一来就简单了。只要将这条shit每盘一节转个方向就好了,所以一个循环就搞定了。

  1. //
  2. //螺旋矩阵
  3. //
  4. #include
  5. #include
  6. int main(int argc, char argv[])
  7. {
  8. const int _Max_M = 15;//行
  9. const int _Max_N = 10;//列
  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;
  11. int direction = 0;//0右,1下,2左,3上
  12. for (int data = begin; data <= begin+_Max_N*_Max_M-1; ++data)
  13. {
  14. array[i][j] = data;
  15. printf("[%d][%d]=%d\t", i, j,array[i][j]);//过程打印
  16. if(!(data%5))std::cout<<"\n";
  17. switch (direction)
  18. {
  19. case 0:
  20. ++j;
  21. if(j == right){
  22. direction = ++direction%4;
  23. --right;
  24. }
  25. break;
  26. case 1:
  27. ++i;
  28. if(i == bottom){
  29. direction = ++direction%4;
  30. --bottom;
  31. }
  32. break;
  33. case 2:
  34. --j;
  35. if(j == left){
  36. direction = ++direction%4;
  37. ++left;
  38. }
  39. break;
  40. case 3:
  41. --i;
  42. if(i-1 == top){
  43. direction = ++direction%4;
  44. ++top;
  45. std::cout<<"\n\n";
  46. }
  47. break;
  48. }
  49. }
  50. std::cout<<"\n=============================================\n"<

结果