作者:
晚于: 2020-08-26 12:00:00后提交分数乘系数50%
截止日期: 2020-09-02 12:00:00
问题描述 :
让我们一起来玩扫雷游戏!
给定一个代表游戏板的二维字符矩阵。 'M' 代表一个未挖出的地雷,'E' 代表一个未挖出的空方块,'B' 代表没有相邻(上,下,左,右,和所有4个对角线)地雷的已挖出的空白方块,数字('1' 到 '8')表示有多少地雷与这块已挖出的方块相邻,'X' 则表示一个已挖出的地雷。
现在给出在所有未挖出的方块中('M'或者'E')的下一个点击位置(行和列索引),根据以下规则,返回相应位置被点击后对应的面板:
如果一个地雷('M')被挖出,游戏就结束了- 把它改为 'X'。
如果一个没有相邻地雷的空方块('E')被挖出,修改它为('B'),并且所有和其相邻的未挖出方块都应该被递归地揭露。
如果一个至少与一个地雷相邻的空方块('E')被挖出,修改它为数字('1'到'8'),表示相邻地雷的数量。
如果在此次点击中,若无更多方块可被揭露,则返回面板。
示例 1:
输入:
[['E', 'E', 'E', 'E', 'E'],
['E', 'E', 'M', 'E', 'E'],
['E', 'E', 'E', 'E', 'E'],
['E', 'E', 'E', 'E', 'E']]
Click : [3,0]
输出:
[['B', '1', 'E', '1', 'B'],
['B', '1', 'M', '1', 'B'],
['B', '1', '1', '1', 'B'],
['B', 'B', 'B', 'B', 'B']]
解释:
示例 2:
输入:
[['B', '1', 'E', '1', 'B'],
['B', '1', 'M', '1', 'B'],
['B', '1', '1', '1', 'B'],
['B', 'B', 'B', 'B', 'B']]
Click : [1,2]
输出:
[['B', '1', 'E', '1', 'B'],
['B', '1', 'X', '1', 'B'],
['B', '1', '1', '1', 'B'],
['B', 'B', 'B', 'B', 'B']]
解释:
注意:
输入矩阵的宽和高的范围为 [1,50]。
点击的位置只能是未被挖出的方块 ('M' 或者 'E'),这也意味着面板至少包含一个可点击的方块。
输入面板不会是游戏结束的状态(即有地雷已被挖出)。
简单起见,未提及的规则在这个问题中可被忽略。例如,当游戏结束时你不需要挖出所有地雷,考虑所有你可能赢得游戏或标记方块的情况。
可使用以下main函数:
int main()
{
vector<vector<char> > board;
int m,n,x,y;
cin>>m;
cin>>n;
char ch;
for(int i=0; i<m; i++)
{
vector<char> aLine;
for(int j=0; j<n; j++)
{
cin>>ch;
aLine.push_back(ch);
}
board.push_back(aLine);
}
cin>>x>>y;
vector<int> click;
click.push_back(x);
click.push_back(y);
vector<vector<char>> res=Solution().updateBoard(board,click);
for(int i=0; i<res.size(); i++)
{
vector<char> aLine = res[i];
for(int j=0; j<aLine.size(); j++)
cout<<aLine[j];
cout<<endl;
}
return 0;
}
输入说明 :
首先输入矩阵的高度m和宽度n,它们的范围为 [1,50]
然后输入m行,每行n个字符,字符的含义见描述。
最后输入两个整数,表示点击的位置行、列坐标。
输出说明 :
输出最后矩阵的状态
输入范例 :
输出范例 :
#include <iostream> #include <vector> #include <queue> using namespace std; class Solution { public: const int dx[8]={0,0,1,1,1,-1,-1,-1}; const int dy[8]={1,-1,-1,0,1,-1,0,1}; vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) { int x=click[0],y=click[1]; if(board[x][y]=='M')//如果是M。直接修改成X,返回 { board[x][y]='X'; return board; } queue<pair<int,int>> Q; Q.push({x,y}); board[x][y]='B';//先把值赴成B int m=board.size(),n=board[0].size(); while(!Q.empty())//宽度搜索 { pair<int,int> front=Q.front(); Q.pop(); int count=0; for(int i=0;i<8;i++) { int newx=front.first+dx[i]; int newy=front.second+dy[i]; if(newx>=0&&newx<m&&newy>=0&&newy<n&&board[newx][newy]=='M')//判断出队列的附近有没有'M',有的话个数加1 count++; } if(count==0)//如果附近没有雷,进行宽度有限搜索八个方向的 { for(int i=0;i<8;i++) { int newx=front.first+dx[i]; int newy=front.second+dy[i]; if(newx>=0&&newx<m&&newy>=0&&newy<n&&board[newx][newy]=='E') { board[newx][newy]='B'; Q.push({newx,newy}) ; } } } else//如果附近有雷,把个数改成雷的个数 board[front.first][front.second]='0'+count; } return board; } }; int main() { vector<vector<char> > board; int m,n,x,y; cin>>m; cin>>n; char ch; for(int i=0; i<m; i++) { vector<char> aLine; for(int j=0; j<n; j++) { cin>>ch; aLine.push_back(ch); } board.push_back(aLine); } cin>>x>>y; vector<int> click; click.push_back(x); click.push_back(y); vector<vector<char>> res=Solution().updateBoard(board,click); for(int i=0; i<res.size(); i++) { vector<char> aLine = res[i]; for(int j=0; j<aLine.size(); j++) cout<<aLine[j]; cout<<endl; } return 0; }