我想出了一个算法来解决leetcode上发布的包围区域问题。
但可悲的是我的解决方案可以通过第一个判断输入集,但不能通过第二个更大的输入集,并且报告运行时错误。但是,我可以在我的笔记本电脑上成功运行!我在这个问题上花了几个小时,但我仍然不知道!
下面是问题。
给定一个包含“X”和“O”的二维板,捕获所有被“X”包围的区域。
通过将包围区域中的所有“O”翻转为“X”来捕获一个区域。
例如,
XXXX
XOOX
XXOX
XOXX
运行你的函数后,板应该是:
XXXX
XXXX
XXXX
XOXX
以下是我的解决方案:
class Solution {
public:
void solve(vector<vector<char> > &board) {
if(board.size() == 0) return;
int row = board.size();
set<pair<int, int> > map;
for(int i=0; i<= row/2; i++){
int bottom = row-i-1;
for(int j=i; j<= bottom; j++){
checkPoint(board, i, j, map);
checkPoint(board, bottom, j, map);
checkPoint(board, j, i, map);
checkPoint(board, j, bottom, map);
}
}
}
void mark(vector<vector<char> >& board, int row, int col, set<pair<int, int> >& map){
if(row < 0 || row > board.size()-1 || col < 0 || col > board[0].size()-1 )
return;
int temp = col;
while(temp-1 >= 0 && board[row][temp-1] == 'O' &&\
map.find(pair<int,int>(row, temp-1)) == map.end()){
map.insert(pair<int, int>(row, temp-1));
temp -=1;
mark(board, row, temp, map);
}
temp = col;
while(temp+1 <= board[0].size()-1 && board[row][temp+1] == 'O' && \
map.find(pair<int,int>(row, temp+1)) == map.end()){
map.insert(pair<int, int>(row, temp+1));
temp +=1;
mark(board, row, temp, map);
}
temp = row;
while(temp -1 >= 0 && board[temp-1][col] == 'O'&& \
map.find(pair<int,int>(temp-1, col)) == map.end()){
map.insert(pair<int, int>(temp-1, col));
temp -=1;
mark(board, temp, col, map);
}
temp = row;
while(temp+1 <= board.size()-1 && board[temp+1][col] == 'O'&& \
map.find(pair<int,int>(temp+1, col)) == map.end()){
map.insert(pair<int, int>(temp+1, col));
temp +=1;
mark(board, temp, col, map);
}
}
void checkPoint(vector<vector<char> >& board, int row, int col, set<pair<int, int> >& map){
if(board[row][col] == 'O'){
if(row ==0 || col== 0 || row == board.size()-1 || col == board[0].size()-1 ){
if(map.find(pair<int, int>(row, col)) == map.end()){
map.insert(pair<int,int>(row, col));
mark(board, row, col, map);
}
}else if(map.find(pair<int, int>(row, col)) == map.end()){
board[row][col] = 'X';
}
}
return;
}
};