zoukankan      html  css  js  c++  java
  • [LeetCode] Spiral Matrix II

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

    For example,
    Given n = 3,

    You should return the following matrix:
    [
     [ 1, 2, 3 ],
     [ 8, 9, 4 ],
     [ 7, 6, 5 ]
    ]

    Solution:
    class Solution {
    public:
        int **used;
        vector<vector<int> > generateMatrix(int n) {
            vector< vector<int > > ans;
            if(n == 0) return ans;
            
            used = new int*[n];
            for(int i = 0;i < n;i++)
            {
                used[i] = new int[n];
                memset(used[i], 0, n * sizeof(int));
            }
            
            int x = 0, y = -1, count = 1, dir = 1; //1 for right, 2 for down, 3 for left, 4 for up
            bool flag = true;
            while(flag)
            {
                switch(dir)
                {
                    case 1:
                    //current direction is right, try continue
                    if(y + 1 < n && used[x][y + 1] == 0)
                        used[x][(y++) + 1] = count++;
                        else if(x + 1 < n && used[x + 1][y] == 0)
                            {
                                used[(x++) + 1][y] = count++;
                                dir = 2;
                            }
                            else
                                flag = false;   
                    break;
                    case 2:
                    //current direction is right, try continue
                    if(x + 1 < n && used[x + 1][y] == 0)
                        used[(x++) + 1][y] = count++;
                        else if(y - 1 >= 0 && used[x][y - 1] == 0)
                            {
                                used[x][(y--) - 1] = count++;
                                dir = 3;
                            }
                            else
                                flag = false;   
                    break;
                    case 3:
                    //current direction is right, try continue
                    if(y - 1 >= 0 && used[x][y - 1] == 0)
                        used[x][(y--) - 1] = count++;
                        else if(x - 1 >= 0 && used[x - 1][y] == 0)
                            {
                                used[(x--) - 1][y] = count++;
                                dir = 4;
                            }
                            else
                                flag = false;
                    break;
                    case 4:
                    //current direction is right, try continue
                    if(x - 1 >= 0 && used[x - 1][y] == 0)
                        used[(x--) - 1][y] = count++;
                        else if(y + 1 < n && used[x][y + 1] == 0)
                            {
                                used[x][(y++) + 1] = count++;
                                dir = 1;
                            }
                            else
                                flag = false;   
                    break;
                    default: break;
                }
            }
            
            for(int i = 0;i < n;i++)
            {
                vector<int > tmp;
                for(int j = 0;j < n;j++)
                    tmp.push_back(used[i][j]);
                ans.push_back(tmp);
            }
            return ans;
        }
    };
    
    
  • 相关阅读:
    Golang之redis
    Golang之Socket
    Golang之单元测试
    Golang之定时器,recover
    Python深度学习之安装theano(windows)
    电容充放电时间常数RC计算方法(转载)
    输入阻抗的理解(转载)
    浮点数的二进制表示
    modbus-poll和modbus-slave工具的学习使用——modbus协议功能码04的解析——04读输入寄存器
    STM32调试中遇到的工具困难(转载+整理)
  • 原文地址:https://www.cnblogs.com/changchengxiao/p/3590698.html
Copyright © 2011-2022 走看看