【程式設計師面試金典】洪水

HelloZEX發表於2018-07-26

拷貝了很多的題目和程式碼,發現這樣並不是一個很好的習慣,應該將具有特點的,有明顯價值題目留存作為筆記。


題目描述

在一個nxm矩陣形狀的城市裡爆發了洪水,洪水從(0,0)的格子流到這個城市,在這個矩陣中有的格子有一些建築,洪水只能在沒有建築的格子流動。請返回洪水流到(n - 1,m - 1)的最早時間(洪水只能從一個格子流到其相鄰的格子且洪水單位時間能從一個格子流到相鄰格子)。

給定一個矩陣map表示城市,其中map[i][j]表示座標為(i,j)的格子,值為1代表該格子有建築,0代表沒有建築。同時給定矩陣的大小nm(n和m均小於等於100),請返回流到(n - 1,m - 1)的最早時間。保證洪水一定能流到終點。


/* 四個方向遍歷搜尋,用遞迴始終是超時,後來參考網上其他大神的方法,用佇列來實現四個方向的迭代搜尋。*/

class Flood {
public:
    int floodFill(vector<vector<int> > map, int n, int m) {
        // write code here
        if(n == 0||m == 0|| map[0][0]) return 0;
        queue<int> qRecord;
        int direction[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
        int x,y,next_x,next_y;
        int point;
        int k;
        qRecord.push(0);
        while(!qRecord.empty())
        {
            point = qRecord.front();
            qRecord.pop();
            x = point/m;
            y = point%m;
            if((x+1) == n && (y+1) == m)
            {
                return map[n-1][m-1];
            }
            for(k=0;k<4;k++)
            {
                next_x = x + direction[k][0];
                next_y = y + direction[k][1];
                if(next_x>=0 && next_x<n && next_y>=0 && next_y<m && map[next_x][next_y] == 0)
                {
                    qRecord.push(next_x*m+next_y);
                    map[next_x][next_y] = map[x][y] + 1;
                }
            }
        }
        return 0;
    }
};

 

相關文章