zoukankan      html  css  js  c++  java
  • 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-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 walk in a clockwise spiral shape to visit every position in this grid.

    Whenever we would 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]]

    avatag

    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]]

    avatag

    Note:

    1. 1 <= R <= 100
    2. 1 <= C <= 100
    3. 0 <= r0 < R
    4. 0 <= c0 < C
    class Solution:
        def spiralMatrixIII(self, R, C, r0, c0):
            """
            :type R: int
            :type C: int
            :type r0: int
            :type c0: int
            :rtype: List[List[int]]
            """
            count = 1
            l = 1
            res = []
            direction = 1
            res.append([r0,c0])
            while count<R*C:
                if direction==1:
                    c0 += l
                    # print('direction:1,pos:',r0,c0)
                    for i in range(c0-l+1,c0+1): #不考虑起点,考虑终点
                        if 0<=r0<R and 0<=i<C:
                            res.append([r0,i])
                            count += 1
                    #         print(count)
                    # print(res)
                    direction = 2
                    continue
                if direction==2:
                    r0 += l
                    # print('direction:2,pos:',r0,c0)
                    for i in range(r0-l+1,r0+1):
                        if 0<=i<R and 0<=c0<C:
                            res.append([i,c0])
                            count += 1
                    #         print(count)
                    # print(res)
                    direction = 3
                    l += 1
                    continue
                if direction==3:
                    c0 -= l
                    # print('direction:3,pos:',r0,c0)
                    for i in range(c0+l-1,c0-1,-1):
                        if 0<=r0<R and 0<=i<C:
                            res.append([r0,i])
                            count += 1
                    #         print(count)
                    # print(res)
                    direction = 4
                    continue
                if direction == 4:
                    r0 -= l
                    # print('direction:4,pos:',r0,c0)
                    for i in range(r0+l-1,r0-1,-1):
                        if 0<=i<R and 0<=c0<C:
                            res.append([i,c0])
                            count += 1
                    #         print(count)
                    # print(res)
                    direction = 1
                    l += 1
                    continue
            return res
    

    每次转换方向,每走两次长度加1,循环跳出条件为数量达到所有格子数。对于每一次走,判断若在棋盘范围内就保存下来。

  • 相关阅读:
    总结下目前维护团队中用到的一些技术和工具
    一次修改时间导致的ORACLE 实例崩溃
    ruby 用watir 登录 CU的代码
    最近好烦.真的好烦
    Lucene.Net学习
    项目上线了,心情好爽
    轻松掌握XMLHttpRequest对象[转]
    微软发布3款SQL Injection攻击检测工具
    Domino开发
    用在JavaScript的RequestHelper [转]
  • 原文地址:https://www.cnblogs.com/bernieloveslife/p/9799042.html
Copyright © 2011-2022 走看看