其實這道題非常思路簡單,bfs或者dfs找到所有連在一起的O,如果這些O中有一個挨著邊,那就不變,否則就是被surrounded的,全部變成X就行 但是很久沒寫bfs導致了入隊的時候沒有判重,導致了大量的點入隊超過1次。所以Large dataset時就TLE了。判重之後輕松通過,64ms。不多說了,直接上代碼:
/**
* @file Surrounded_Regions.cpp
* @Brief
* @author Brian
* @version 1.0
* @date 2013-09-07
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <memory.h>
#include <algorithm>
#include <math.h>
#include <queue>
#include <vector>
using namespace std;
class Solution {
private:
struct point{
int x;
int y;
point(int _x,int _y):x(_x),y(_y){}
point(){}
};
int start;
int end;
point Points[100000];
void bfs(vector<vector<char> > &board, int r,int c, int row, int col){
vector<point> buf;
queue<point> q;
bool reachBoundary = false;
start = 0;
end =0;
//q.push(point(r,c));
Points[end++]=point(r,c);
//while(!q.empty()){
while(start<end){
/* point p = q.front();
q.pop();*/
point p = Points[start++];
board[p.x][p.y] = 'v';
//search up,down,left,right
reachBoundary |= expand(board,q,p.x-1,p.y,row,col,'O');
reachBoundary |= expand(board,q,p.x+1,p.y,row,col,'O');
reachBoundary |= expand(board,q,p.x,p.y-1,row,col,'O');
reachBoundary |= expand(board,q,p.x,p.y+1,row,col,'O');
}
char ch = reachBoundary?'k':'X';
for(int i=0;i<end;i++){
point p = Points[i];
board[p.x][p.y] = ch;
}
}
int expand(vector<vector<char> > &board , queue<point> &q, int x,int y, int row, int col,char c){
if(x<0||x>=row||y<0||y>=col)
return true;
else{
if(board[x][y]==c ){
//q.push(point(x,y));
Points[end++]=point(x,y);
//這個是判重用的,防止同一個點入隊多次。下一次到這一個點時
// if判斷就不成立了,也就防止了再次入隊。
board[x][y]=c+1;
}
return false;
}
}
public:
Solution(){
}
void solve(vector<vector<char> > &board) {
int row = board.size();
if(row==0)
return ;
int col = board[0].size();
for(int r=0;r<row;r++){
for(int c=0;c<col;c++){
if(board[r][c]=='O')
bfs(board,r,c,row,col);
}
}
for(int r=0;r<row;r++){
for(int c=0;c<col;c++){
if(board[r][c]=='k')
board[r][c]='O';
}
}
}
};
int main(){
Solution s;
char src[30][30] = {{"XOOOOOOOOOOOOOOOOOOO"},{"OXOOOOXOOOOOOOOOOOXX"},{"OOOOOOOOXOOOOOOOOOOX"},{"OOXOOOOOOOOOOOOOOOXO"},{"OOOOOXOOOOXOOOOOXOOX"},{"XOOOXOOOOOXOXOXOXOXO"},{"OOOOXOOXOOOOOXOOXOOO"},{"XOOOXXXOXOOOOXXOXOOO"},{"OOOOOXXXXOOOOXOOXOOO"},{"XOOOOXOOOOOOXXOOXOOX"},{"OOOOOOOOOOXOOXOOOXOX"},{"OOOOXOXOOXXOOOOOXOOO"},{"XXOOOOOXOOOOOOOOOOOO"},{"OXOXOOOXOXOOOXOXOXOO"},{"OOXOOOOOOOXOOOOOXOXO"},{"XXOOOOOOOOXOXXOOOXOO"},{"OOXOOOOOOOXOOXOXOXOO"},{"OOOXOOOOOXXXOOXOOOXO"},{"OOOOOOOOOOOOOOOOOOOO"},{"XOOOOXOOOXXOOXOXOXOO"}};
//char src[30][30] = {{"OO"},{"OO"}};
vector<vector<char> > board;
int n=20;
for(int i=0;i<n;i++){
vector<char> row;
for(int j=0;j<n;j++){
row.push_back(src[i][j]);
}
board.push_back(row);
}
s.solve(board);
return 0;
}