1. 程式人生 > >leetcode---529 掃雷遊戲

leetcode---529 掃雷遊戲

這種題目對我來說就是題意我都不能理解了,其實看懂了他說的哪些條件,並不太難。

 

  1. 如果一個地雷('M')被挖出,遊戲就結束了- 把它改為 'X'。 
  2. 如果一個沒有相鄰地雷的空方塊('E')被挖出,修改它為('B'),並且所有和其相鄰的方塊都應該被遞迴地揭露。也就是說如果相鄰的方塊如果有相鄰的地雷那麼就不再繼續遞迴下去,並且把此處位置改成周圍的地雷的數量。
  3. 如果一個至少與一個地雷相鄰的空方塊('E')被挖出,修改它為數字('1'到'8'),表示相鄰地雷的數量。
  4. 如果在此次點選中,若無更多方塊可被揭露,則返回面板。

 

 

直接程式碼吧: 

class Solution {
public:
    int r,c;
    int visit[55][55];
    void isnumber(int row,int col,vector<vector<char>>& ans)
    {
        if (ans[row][col]=='M')
        {
            ans[row][col]='X';
            return ;
        }
        if (ans[row][col]!='E')
            return ;
        int dir[8][2]={{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
        int count=0;
        for (int i=0;i<8;i++)
        {
            int stepr=row+dir[i][0];
            int stepc=col+dir[i][1];
           if (stepr==ans.size()||stepc==ans[0].size()||stepr<0||stepc<0)
                continue;
            if (ans[stepr][stepc]=='M')
            {
                count++;
            }
        }
        if (count!=0)
        ans[row][col]=char('0'+count);
        else 
        {
            ans[row][col]='B';
        visit[row][col]=1;
         for (int i=0;i<8;i++)
        {
            int stepr=row+dir[i][0];
            int stepc=col+dir[i][1];
            if (stepr==ans.size()||stepc==ans[0].size()||stepr<0||stepc<0||visit[stepr][stepc]==1)
                continue;
            isnumber(stepr,stepc,ans);
        }
        }
    
    }
    vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) {
        auto it =click.begin();
        vector<vector<char>> ans=board;
         r=ans.size();
         c=ans[0].size();
         visit[51][51]={0};
        for (;it!=click.end();it++)
        {
            int row=*it;
            it++;
            int col=*it;
            isnumber(row,col,ans);   
        }
        return ans;
    }
};

     看不懂題目的意思。。。。。