螺旋矩阵 题解
2016-01-23 10:13
316 查看
螺旋矩阵
【问题描述】
一个n行n列的螺旋矩阵可由如下方法生成:
从矩阵的左上角(第1行第1列)出发,初始时向右移动;
如果前方是未曾经过的格子, 则继续前进,否则右转;
重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入1, 2, 3, ... , n2,便构成了一个螺旋矩阵。
下图是一个n = 4 时的螺旋矩阵。
现给出矩阵大小n以及i和j,请你求出该矩阵中第i行第j列的数是多少。
【题解】
首先,本题有两种思路。
1.老老实实填数组。(此方法简单易懂,但当矩阵过大时,就会出现数组开不够大,或long long也不够的情况)
2. 用算法找规律,但规律不是一般的难找。我就简单说说我找到的规律。
首先对比两表,你就会发现下表就是上表中间四格每个减去12,正好就是外圈12个数中最大的;
而12就是外圈边长的4倍减4;
于是,就成了这样
红色是内圈,黑色是外圈
红色基数为12,黑色基数为0
同时,每一圈最上方的一行就是i的值。
最右方的一列就是n(i)+j-1的值。
最下方的一行就是4n-i-j-1的值。
最左方的一列就是4n-i-j-1的值。
(一定要记得加上外圈基数哦!)
【参考程序】
c语言
【问题描述】
一个n行n列的螺旋矩阵可由如下方法生成:
从矩阵的左上角(第1行第1列)出发,初始时向右移动;
如果前方是未曾经过的格子, 则继续前进,否则右转;
重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入1, 2, 3, ... , n2,便构成了一个螺旋矩阵。
下图是一个n = 4 时的螺旋矩阵。
现给出矩阵大小n以及i和j,请你求出该矩阵中第i行第j列的数是多少。
【题解】
首先,本题有两种思路。
1.老老实实填数组。(此方法简单易懂,但当矩阵过大时,就会出现数组开不够大,或long long也不够的情况)
2. 用算法找规律,但规律不是一般的难找。我就简单说说我找到的规律。
1 | 2 | 3 | 4 |
12 | 13 | 14 | 5 |
11 | 16 | 15 | 6 |
10 | 9 | 8 | 7 |
1 | 2 |
4 | 3 |
而12就是外圈边长的4倍减4;
于是,就成了这样
1 | 2 | 3 | 4 |
12 | 1 | 2 | 5 |
11 | 3 | 4 | 6 |
10 | 9 | 8 | 7 |
红色基数为12,黑色基数为0
同时,每一圈最上方的一行就是i的值。
最右方的一列就是n(i)+j-1的值。
最下方的一行就是4n-i-j-1的值。
最左方的一列就是4n-i-j-1的值。
(一定要记得加上外圈基数哦!)
【参考程序】
c语言
<pre name="code" class="cpp">#include<cstdio> int i=2,j=3,n=3; void luo(int n1) { int a=0,k,l; for (l=1;l<n1;l++) { a=a+n*4-l*8+4; } if (i>=j) printf ("%d",a+i+j-2*n1+1); else printf ("%d",a+(n-2*n1+1)*4-i-j+n1+n1+1); } int main() { int i1,j1; scanf ("%d %d %d",&n,&j,&i); i1=i; j1=j; if (i1>n/2) i1=n-i1+1; if (j1>n/2) j1=n-j1+1; if(i1>j1) luo(j1); else luo(i1); }
相关文章推荐
- 【算法】M-02八种基本排序
- 自己选择的路,跪着也要把它走完
- 谨慎使用Java8的默认方法
- 数组指针数组的定义及使用(about array of pointer of array)
- GetBuffer 认识
- Linux时间子系统之四:定时器的引擎:clock_event_device
- hash function/ hash table 背后的数学基础
- pair的一些用法
- Linux时间子系统之五:低分辨率定时器的原理和实现
- 复杂类继承体系结构下,实际的类定义
- 设计模式
- 放苹果题解
- mysql游标循环的使用
- OC中创建对象,存入数组,并且遍历对象
- Derived class重新定义继承而来的Private Virtual函数
- LeetCode 119 Pascal's Triangle II(帕斯卡三角形II)(vector、数学公式)(*)
- Linux时间子系统之六:高精度定时器(HRTIMER)的原理和实现
- Ubuntu14.04 搜索不到WIFI或连接不上的解决方法。
- 处理死链接
- SQL Server代理(3/12):代理警报和操作员