碑文LeetCodeGOGOGOブラシ06--強固な基盤(前処理)

994腐朽オレンジ

難易度:

イージー

アイデア:

図のトピックは、図いくつかの良いといくつかの悪いオレンジオレンジは、悪いオレンジ周りのすべての良いターンが破壊されるミカン、そして最初の数ラウンド後に悪いわけではないオレンジ色を尋ねました。

アイデアは、開始点として悪いオレンジにより人気BFS、検索の層であり、検索はラウンド数を取得するために行うことができます

このような考え方は、本当にいい考えですが、BFSに比べて、通常のラウンドが成長&チェックに応じて、より良い書かれ、よりれます

歩行ラウンド、明確な思考の良い書き込みによってダウン、本当に簡単ですが、また非常に高いコード効率

コード:


/*
Author Owen_Q
*/

class Solution {
public:
    int orangesRotting(vector<vector<int>>& grid) {
        n = grid.size();
        m = grid[0].size();
        int day = 0;
        int num = check(grid);
        while(num>0)
        {
            day++;
            grow(grid);
            if(num>check(grid))
                num = check(grid);
            else
                break;
        }
        if(num>0)
            return -1;
        else
            return day;
    }
private:
    int n,m;
    bool legal(int x,int y)
    {
        if(x<0||x>=n||y<0||y>=m)
            return false;
        else
            return true;
    }
    
    int d[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
    
    void grow(vector<vector<int>>& grid)
    {
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(grid[i][j] == 2)
                {
                    for(int k=0;k<4;k++)
                    {
                        int dx = i + d[k][0];
                        int dy = j + d[k][1];
                        if(legal(dx,dy)&&grid[dx][dy]==1)
                        {
                            grid[dx][dy] = 3;
                        }
                    }
                }
            }
        }
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                if(grid[i][j] == 3)
                    grid[i][j] = 2;
        return ;
    }
    
    int check(vector<vector<int>>& grid)
    {
        int sum = 0;
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                if(grid[i][j] == 1)
                    sum++;
        return sum;
    }
};

59.スパイラルマトリックスII

難易度:

アイデア:

リフィルのヘリカル図面番号、少しまとめ法律

その後、正確2N-1ラウンド用のnパターン仕様を各螺旋四方、ラウンドとして各方向を見つけることが難しいです。最初のラウンドに加えて、ちょうどそうにも保存されているポジショニング、長さを減少するごとに2回の後、あなたはラウンドで直接実行することができます

もちろん、ここでは2次元のベクトルに復帰する必要性のために、あなたはシミュレーションの数を記入する必要がある場合は、そのベクトルは、予め設定されている必要があり、この一般的なフレームワークが初期化されて良い、初期化ベクトルの以下の要約であります

STLの知識レビュー:

初期ベクトル

ベクトル<整数> V(a、b)は

すなわち、B値である要素を有する型intベクトルVの定義を表します。

そして、アナロジーは、2次元配列の初期化モードを取得することができます。

すべての値は初期化二次元アレイの行は、列B cであります

ベクター<ベクトル<整数>> V(ベクトル<整数>(B、C))

コード:


/*
Author Owen_Q
*/

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        int aa = 2, dd = 0, xx = 0, yy = 0, pp = -1, ss=n-1;
        vector<vector<int>> re(n,vector<int>(n,0));
        re[0][0] = 1;
        while(ss>0)
        {
            drawline(aa,dd,xx,yy,pp,ss,re);
        }
        return re;
    }
    
private:
    int d0[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
    void drawline(int &a,int &d,int &x,int &y,int &p, int &s, vector<vector<int>> &r)
    {
        for(int i=0;i<s;i++)
        {
            x += d0[d][0];
            y += d0[d][1];
            r[x][y] = a++;
        }
        d = (d+1) % 4;
        p++;
        if(p==2)
        {
            p = 0;
            s--;
        }
        return ;
    }
};

 

 

公開された97元の記事 ウォン称賛89 ビュー20000 +

おすすめ

転載: blog.csdn.net/Owen_Q/article/details/104065620