螺旋矩阵,是这么一个东西:

1   2   3

8   9   4

7   6   5

这是一个,n*n的矩阵,由外向里一次递增,一环一环,就好像一个螺旋一样。不难想象,如果n=5,那么应该是这样的:

当然,这是的一道笔试程序题,实话说,第一眼看到,还真不会做,因为,c++的数组下标无法从控制台读入。反正就是基础不行,看上去也很难。但是,第二天仔细一想,其实是有规律可循的,于是,就开始做了。因为比较时间有限,而且能力有限,所以有什么更好的方法,欢迎补充。一开始的想法是比较麻烦的,就是每一条螺旋的边,做一个循环,想法是这样的:

1   2   3

8   9   4

7   6   5

先一最上面开始,但是仔细想这样的想法会使得程序比较复杂,因为很明显规律是不太完美的,代码比较多,所以优化了一下,并且还有更多的规律。

1   2   3   4

12 13 14  5

11 16 15  6

10  9   8  7

第一个规律

如果我们把整个矩阵看成是一层一层最外环构成,那么上面的矩阵就是这样的:

1   2   3   4

12           5

11           6                   13  14

10  9   8  7         +        16  15

你可以画更多的矩阵参考,这将作为最外层循环,并且,每次长度减二,这算上不错的发现。

第二个规律

最外层循环这么实现的话,那么问题是我们每一个外壳,可以这么实现,一次性从1到12,但是你很快会发现,这样的下标将是混乱的,所以有必要在循环里面在分循环,而我的思路是这样的:

1   2   3                   4

+            5          +                    +       12

6                                          11

9   8   7             10

这样四步是很有规律的,我们虽然可以用四个循环实现,但是因为这四个不同区域的矩阵是同时递增,那么我可以让四个矩阵同时在一个循环里面同时赋值,很明显,上面的这个循环是3。写到这里,你应该是发现了第一个规律的意义,这样子,整个矩阵分成了完全相同的步骤,一层一层向里面变小,每一层的赋值也得到了保证,但是问题是终结点在哪里呢,算法的有限性。

第三个规律:

考虑到最后的终结点,你可以这么理解,在第一个规律的基础上,我们每一层可能依次减二,那么就有这样的规律,对于任意正整数n,依次减二,最后只有两种结果,一种是完全为零,一种是为一,说白了就是偶数和奇数的两种可能,而这两种可能最后有什么规律呢?我们看两种矩阵:

1   2   3

8   9   4

7   6   5

1   2   3   4

12 13 14  5

11 16 15  6

10  9   8   7

很明显,如果是1,那么就是2*2的小矩阵,你可以发现在这个点上,也就是第二个规律中每一条边为1的情况,但是如果是零,那么他是一个数,只有一个,这种情况我们有必要拿出来,因为在上面两种情况,最后是不会出现这种可能性。还是只看我实现的代码吧:

#include <iostream>
using namespace std; void sparalMat(int *array[],int n)
{
int time = ;
int start = ; //左上角起始点,做个补充,这个是每一个外壳,第一个起始点。
while (time < n)
{
if (n--time==)
{
array[time / ][time / ] = start;
}
for (int i = ; i < n--time; ++i)
{
array[(time / )][time/+i] = start + i;
array[time / + i][n - - time / ] = start + (n - time - ) + i;
array[n- - time / ][n- - time / - i] = start + * (n - - time) + i;
array[n - - time / - i][time / ] = start + * (n - - time) + i;
} start += * (n - - time);
time += ;
}
} //主函数入口
int _tmain(int argc, _TCHAR* argv[])
{
int ha = ;
cin >> ha;
int **a = new int*[ha];
for (int i = ; i < ha; i++) //这一块仅仅是动态内存分配,与算法无关
{
a[i] = new int[ha];
}
sparalMat(a, ha);
for (int i = ; i < ha; i++)
{
for (int j = ; j < ha; j++)
{
cout << a[i][j] << "\t";
}
cout << endl;
}
for (int i = ; i < ha; i++) //内存释放,我觉得有必要释放,即使是在程序结束时。
{
delete [] a[i];
}
delete[] a;
return ;
}

没错,我决定还是相当简洁的,我用了动态内存释放,之前不知道,但是数组下标无法从控制台读入,所以很麻烦,只能这么玩。思路就是这样。现在看看它的运行结果吧,我取

1,3,6,7,10。这五种情况:

1:

3:

6:

7:

10:

最后,就是这样,见笑了。

c++实现螺旋矩阵分析总结的更多相关文章

  1. PAT 1050. 螺旋矩阵(25)

    本题要求将给定的N个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第1个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为m行n列,满足条 ...

  2. [LeetCode] Spiral Matrix II 螺旋矩阵之二

    Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For ...

  3. [LeetCode] Spiral Matrix 螺旋矩阵

    Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral or ...

  4. C算法编程题(二)正螺旋

    前言 上一篇<C算法编程题(一)扑克牌发牌> 写东西前总是喜欢吐槽一些东西,还是多啰嗦几句吧,早上看了一篇博文<谈谈外企涨工资那些事>,里面楼主讲到外企公司包含的五类人,其实不 ...

  5. openjudge 螺旋加密

    /*======================================================================== 25:螺旋加密 总时间限制: 1000ms 内存限 ...

  6. leetcode-Spiral Matrix II 螺旋矩阵2之python大法好,四行就搞定,你敢信?

    Spiral Matrix II 螺旋矩阵 Given an integer n, generate a square matrix filled with elements from 1 to n2 ...

  7. YTU 3019: 螺旋方阵

    3019: 螺旋方阵 时间限制: 1 Sec  内存限制: 128 MB 提交: 2  解决: 2 题目描述 以下是一个5*5阶螺旋方阵.设计一个程序,输出该形式的n*n阶方阵(顺时针方向旋进).   ...

  8. Java-基础编程(螺旋矩阵&乘法表)

    package cn.rick.study; import java.io.BufferedReader;import java.io.InputStreamReader;import java.ut ...

  9. NOIP 2014 普及组 T3 螺旋矩阵

    [题意] 已知:n,r,c(n<=30000) 条件:给定n行n列的螺旋矩阵(从矩阵的左上角(1,1)出发,初始时向右移动:如果前方是未曾经过的格子, 则继续前进,否则右转:重复上述操作直至经过 ...

随机推荐

  1. Mariadb 10.1 joiner节点加入报错WSREP: Failed to prepare for incremental state transfer

    Mariadb 10.1 galera cluster 集群joiner 节点加入集群 会出现这种报错,导致mysql一直点点点,这里我贴出报错.2016年04月19日13:34:58 2016-04 ...

  2. []with[[]]

    [brand@localhost ~]$ echo $name hello hello [brand@localhost ~]$ [$name = "hello"] -bash: ...

  3. # 20145334 《Java程序设计》第9周学习总结

    20145334 <Java程序设计>第9周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC 1.Java语言访问数据库的一种规范,是一套API. 2.JDBC (Java Da ...

  4. Kmeans方法

    基本Kmeans算法介绍及其实现 http://blog.csdn.net/qll125596718/article/details/8243404/ kmeans++ http://www.52ml ...

  5. BizTalk开发系列(二十) 类型作用域

    Orchestration中的Type概念跟.NET 里的Class一样,可以在Orchestration开过过程中将多个实例绑定到一种类型.Orchestration 视图里包括的类型有Port T ...

  6. 限制EditText只能输入小数点后两位

    设置EditText只能输入小数点后两位,在价格等有限制的输入时特别有效 TextWatcher textWatcher = new TextWatcher() { @Override public ...

  7. play for scala 通过网易smtp发送邮件

    最近用play来做一个小项目,里面用到了发送邮件的功能.这里我将这部分抽出来分享,毕竟目前来看paly于scala方面的中文资料在网上还是毕竟少,希望我的这篇文章能为有需要的人提供一点思路. 下面写下 ...

  8. KeyValuePair

    KeyValuePair用法(转)(2012-06-25 10:47:35) 转载▼ // 标签: keyvaluepair it   KeyValuePair C# KeyValuePair< ...

  9. Selenium2学习-038-firefox、webdriver版本不对称问题解决:org.openqa.selenium.firefox.NotConnectedException: Unable to connect to host 127.0.0.1 on port 7055

    今天有个朋友在群里问,为何脚本运行不通过,其脚本操作步骤简单描述如下: 1.启动火狐浏览器 2.打开百度 3.查询框输入关键字 4.点击按钮[百度一下] 脚本挺简单的,其给出的应用报错信息如下所示: ...

  10. asp.net页面间传值方式

    使用asp.net开发项目,必然会在页面间进行传值,本文介绍几种常见的页面传值方式,仅作笔记,以便后续查找使用. 前提:新建两个页面:ValuePage.aspx,ObtainValue.aspx,本 ...