• 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. 1 <= R <= 100
  2. 1 <= C <= 100
  3. 0 <= r0 < R
  4. 0 <= 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 Ⅲ的更多相关文章

  1. [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 ...

  2. LeetCode 885. Spiral Matrix III

    原题链接在这里:https://leetcode.com/problems/spiral-matrix-iii/ 题目: On a 2 dimensional grid with R rows and ...

  3. 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 ...

  4. 【LeetCode】885. Spiral Matrix III 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

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

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

  6. [LeetCode] Spiral Matrix 螺旋矩阵

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

  7. 【leetcode】Spiral Matrix II

    Spiral Matrix II Given an integer n, generate a square matrix filled with elements from 1 to n2 in s ...

  8. 【leetcode】Spiral Matrix II (middle)

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

  9. 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 ...

随机推荐

  1. DiscuzX /source/function/function_core.php通用核心函数库文件分析

    ... <?php /** * [Discuz!] (C)2001-2099 Comsenz Inc. * This is NOT a freeware, use is subject to l ...

  2. 招聘IT图书兼职作者(长期兼职)

    招聘图书兼职作者(长期兼职),本公司有十多年的计算机图书出版经验,每年出版上百本编程类图书, 和清华大学出版社 电子工业出版社 机械工业出版社都有很好的合作.你可以不用按时上线,不用天天被boss盯着 ...

  3. cmake中添加-fPIC编译选项方法

    合并openjpeg/soxr/vidstab/snappy等多个cmake库时,为了解决下述问题: relocation R_X86_64_32 against `.text' can not be ...

  4. Cleanmymac X好不好用?

    Cleanmymac X是一款Mac清理软件,能够帮助我们快速实现快速实现磁盘清理,是mac用户的智能助手.那么为什么大家会认定它并坚定不移呢?小编带你感受感受. 1. 简洁大气的外观. 用户正版官方 ...

  5. scrapy 快速入门

    https://blog.csdn.net/u011054333/article/details/70165401

  6. day1.接口测试(概念、Postman、SoapUI、jmeter)

    一.什么是接口测试 接口测试是测试系统组件间接口的一种测试.接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点.测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑 ...

  7. Last Work-随机出题加法游戏

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  8. CSS3之圣杯布局和双飞翼布局

    圣杯布局: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  9. Linux内核中的printf实现

    1 #ifndef __PRINT_H_ 2 #define __PRINT_H_ 3 4 void print(char* fmt, ...); 5 void printch(char ch); 6 ...

  10. postgre索引

    1.创建一般索引 单字段索引: CREATE INDEX index_name ON table_name (field1); 联合索引: CREATE INDEX index_name ON tab ...