[Solution] 885. Spiral Matrix Ⅲ
- Difficulty: Medium
Problem
On a 2 dimensional grid with R rows and C columns, we start at (r0, c0) facing east.
Here, the north-west corner of the grid is at the first row and column, and the south-east corner of the grid is at the last row and column.
Now, we talk in a clockwise spiral shape to visit every position in this grid.
Whenever we could move outside the boundary of the grid, we continue our walk outside the grid (but may return to the grid boundary later.)
Eventually, we reach all R * C spaces of the grid.
Return a list of coordinates representing the positions of the grid in the order they were visited.
Example 1:
Input: R = 1, C = 4, r0 = 0, c0 = 0
Output: [[0, 0], [0, 1], [0, 2], [0, 3]]

Example 2:
Input: R = 5, C = 6, r0 = 1, c0 = 4
Output:
[[1, 4], [1, 5],
[2, 5], [2, 4], [2, 3],
[1, 3], [0, 3],
[0, 4], [0, 5],
[3, 5], [3, 4], [3, 3], [3, 2],
[2, 2], [1, 2], [0, 2],
[4, 5], [4, 4], [4, 3], [4, 2], [4, 1],
[3, 1], [2, 1], [1, 1], [0, 1],
[4, 0], [3, 0], [2, 0], [1, 0], [0, 0]]

Note:
1 <= R <= 1001 <= C <= 1000 <= r0 < R0 <= c0 < C
Related Topics
Math
Solution
题意就是给定一个矩阵大小和起始坐标,返回据此条件生成的螺旋方阵的路径,可以走到矩阵之外,但如果坐标落在矩阵之内,则要记录下来。比较容易想到的一个方法是模拟这样的一个走步过程。观察走螺旋的过程,可以发现其在每个方向上走过的距离依次是 [1, 1, 2, 2, 3, 3, ...],借助这个规律,就比较好模拟出来了。
public class Solution
{
public int[][] SpiralMatrixIII(int R, int C, int r0, int c0)
{
int[][] ret = new int[R * C][];
int i = 0;
foreach (var coord in NextCoord(r0, c0))
{
if (0 <= coord.Item1 && coord.Item1 < R &&
0 <= coord.Item2 && coord.Item2 < C)
{
ret[i++] = new int[] { coord.Item1, coord.Item2 };
}
if (i == R * C)
break;
}
return ret;
}
private IEnumerable<Tuple<int, int>> NextCoord(int r, int c)
{
int step = 1;
yield return new Tuple<int, int>(r, c);
for( ; ; )
{
for (int i = 0; i < step; i++)
yield return new Tuple<int, int>(r, ++c);
for (int i = 0; i < step; i++)
yield return new Tuple<int, int>(++r, c);
step++;
for (int i = 0; i < step; i++)
yield return new Tuple<int, int>(r, --c);
for (int i = 0; i < step; i++)
yield return new Tuple<int, int>(--r, c);
step++;
}
}
}
- Note:这里使用到了 C♯ 中的
yield关键字,有关这个的介绍,参见 MSDN 文档。
另外还有一个可行的方法,就是对该矩阵内所有坐标进行排序(首先以其到 (r0, c0) 的距离排序,距离相同的,按照向量 \((r - r_0, c - c_0)^\mathrm{T}\) 与 x 轴正向的夹角大小排序),不过自己似乎写不出这样的代码,留待日后思量。
[Solution] 885. Spiral Matrix Ⅲ的更多相关文章
- [LeetCode] 885. Spiral Matrix III 螺旋矩阵之三
On a 2 dimensional grid with R rows and C columns, we start at (r0, c0) facing east. Here, the north ...
- LeetCode 885. Spiral Matrix III
原题链接在这里:https://leetcode.com/problems/spiral-matrix-iii/ 题目: On a 2 dimensional grid with R rows and ...
- 885. Spiral Matrix III
On a 2 dimensional grid with R rows and C columns, we start at (r0, c0) facing east. Here, the north ...
- 【LeetCode】885. Spiral Matrix III 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- [LeetCode] Spiral Matrix II 螺旋矩阵之二
Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For ...
- [LeetCode] Spiral Matrix 螺旋矩阵
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral or ...
- 【leetcode】Spiral Matrix II
Spiral Matrix II Given an integer n, generate a square matrix filled with elements from 1 to n2 in s ...
- 【leetcode】Spiral Matrix II (middle)
Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For ...
- 59. Spiral Matrix && Spiral Matrix II
Spiral Matrix Given a matrix of m x n elements (m rows, n columns), return all elements of the matri ...
随机推荐
- navicat for mysql 注册码,简简单单,一个搞定(蔡军帅亲测有效)
打开navicat for mysql接着打开帮助,选中注册, 把下面的复制上去就可以了 NAVH-WK6A-DMVK-DKW3 转载自:https://blog.csdn.net/qq_403845 ...
- [UE4]Skeletal Mesh的碰撞体
一.骨骼模型和骨骼碰撞体肯定不是完全吻合的,因为骨骼模型太复杂了. 二.骨骼碰撞体编辑在Physics Asset资源中 三.Constraints:只显示碰撞体 四.对于射击游戏来说,这样的碰撞体完 ...
- TCP的概念
中间节点.虚电路.失败重传 UDP:不可靠传输,并不承诺提供可靠的连接通道,所传送包完全可能失序.重复甚至丢失. TCP:端口号.三次握手建立可靠连接(第一次确认A端发送和B端接收能力,第二次确认A端 ...
- Python绘图的颜色设置
(转载):Python中的matplotlib函数中的颜色选取 转载链接:https://www.cnblogs.com/darkknightzh/p/6117528.html 原文内容:完全出自于自 ...
- Oracle不能连接故障排除[TNS-12541: TNS: 无监听程序]
1. 情况:Oracle安装后使用的好好的,放假关机后重新开机居然发现不能正常连线,客户报错:TNS-12541: TNS: 无监听程序 2. 检查: 1. 服务器上Oracle启动正 ...
- wx.navigateBack(OBJECT)怎么携带参数呢?
wx.navigateBack(OBJECT) 关闭当前页面,返回上一页面或多级页面.可通过 getCurrentPages() 获取当前的页面栈,决定需要返回几层. OBJECT 参数说明: 参数 ...
- 数据库索引的数据结构b+树
b+树的查找过程:如上图所示,如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针, ...
- java生成简单验证码图片
概要 最近项目需要用java实现输出随机验证码图片到前台,正好有机会接触下java的绘图类,完成需求后也有时间做个总结,写篇随笔记录下也希望能帮助到有同样需求的人! 需求流程图 1.生成随机数 在ja ...
- spring boot 请求地址带有.json 兼容处理
项目以前时spring mvc的,现在升级为spring boot ,有些请求地址带有.json后缀,在请求spring boot项目时,无法匹配控制器,spring boot默认选择禁用后缀模式匹配 ...
- HTML5 full-screen全屏API
这篇文章纯属记录,非常感谢张鑫旭大神的demo 原文地址: http://www.zhangxinxu.com/study/201210/html5-full-screen-api.html 代码 C ...