这种题目对我来说就是题意我都不能理解了,其实看懂了他说的哪些条件,并不太难。
- 如果一个地雷('M')被挖出,游戏就结束了- 把它改为 'X'。
- 如果一个没有相邻地雷的空方块('E')被挖出,修改它为('B'),并且所有和其相邻的方块都应该被递归地揭露。也就是说如果相邻的方块如果有相邻的地雷那么就不再继续递归下去,并且把此处位置改成周围的地雷的数量。
- 如果一个至少与一个地雷相邻的空方块('E')被挖出,修改它为数字('1'到'8'),表示相邻地雷的数量。
- 如果在此次点击中,若无更多方块可被揭露,则返回面板。
直接代码吧:
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;
}
};
看不懂题目的意思。。。。。