我正在使用c ++解决problem on Hackerrank(炸弹人问题),并且得到了可行的解决方案。但是解决方案在某些测试案例中出现了超时错误。我找不到其他东西可以优化我的解决方案。
我希望在这里得到一些指导。
我的解决方法在下面
我创建了2个队列来放置炸弹和非炸弹位置
using namespace std;
vector<string> split_string(string);
std::queue<pair<int, int>> Bombspots;
std::queue<pair<int, int>> Next_Bombspots;
此功能只会查看非炸弹点队列并用炸弹填充
void FillPlaces(vector<string>& grid){
while(!Next_Bombspots.empty()){
grid[Next_Bombspots.front().first][Next_Bombspots.front().second] = 'O';
Next_Bombspots.pop();
}
}
此功能将填充炸弹队列
void FindBomb(vector<string>& grid){
for (int i = 0; i < grid.size(); i++){
for (int j = 0; j < grid[i].length(); j++){
if (grid[i][j] == 'O'){
Bombspots.push(make_pair(i,j));
}
}
}
}
此功能将从炸弹现场队列中取出炸弹,将其爆炸并置于非炸弹现场队列中。
void BombNow(vector<string>& grid){
while(!Bombspots.empty()){
int r = Bombspots.front().first;
int c = Bombspots.front().second;
grid[r][c] = '.';
Next_Bombspots.push(make_pair(r,c));
if(r != grid.size() - 1){
grid[r+1][c] = '.';
Next_Bombspots.push(make_pair(r+1,c));
}
if(r != 0){
grid[r-1][c] = '.';
Next_Bombspots.push(make_pair(r-1,c));
}
if(c != grid[r].length() - 1){
grid[r][c+1] = '.';
Next_Bombspots.push(make_pair(r,c+1));
}
if(c != 0){
grid[r][c-1] = '.';
Next_Bombspots.push(make_pair(r,c-1));
}
Bombspots.pop();
}
}
从main调用函数
1)以网格(二维矩阵)作为输入
2)输出最终网格
vector<string> bomberMan(int n, vector<string>& grid) {
for(int i = 0; i < grid.size(); i++){
for (int j = 0; j< grid[i].length(); j++){
if (grid[i][j] == 'O'){
Bombspots.push(make_pair(i,j));
}else{
Next_Bombspots.push(make_pair(i,j));
}
}
}
for (int i = 1; i < n; i++){
if (i%2==0){
BombNow(grid);
FindBomb(grid);
} else {
FillPlaces(grid);
}
}
return(grid);
}