Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'.
A region is captured by flipping all 'O's into 'X's in that surrounded region .
For example,
X X X X X O O X X X O X X O X X
After running your function, the board should be:
X X X X X X X X X X X X X O X X
class Solution {
public:
queue<int> q;
void solve(vector<vector<char>>& board) {
if(board.empty()) return;
int row=board.size();
int col=board[0].size();
//四周的数
for(int j=0;j<col;j++)
{
bfs(board,0,j);//第一行
bfs(board,row-1,j);//最后一行
}
for(int i=1;i<row-1;i++ )
//??????
//去除交集
{
bfs(board,i,0);//第一列
bfs(board,i,col-1);//最后一列
}
for(int i=0;i<row;i++)//最后还原
for(int j=0;i<col;j++)//O转为x,D转为O
{
if(board[i][j]=='D')
board[i][j]='O';
else if(board[i][j]=='O')
board[i][j]='X';
}
}
/* void dfs(vector<vector<char> >&board,int x,int y)
{
if(x<0||x>board.size()-1||y<0||y>board[0].size()-1||board[x][y]!='O')
return ;
board[x][y]='D';
dfs(board,x-1,y);//left
dfs(board,x+1,y);//right
dfs(board,x,y-1);//down
dfs(board,x,y+1);//up
}*/
void bfs(vector<vector<char>> &board,int x,int y)
{
//方向信息
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int row=board.size();
int col=board[0].size();
if(board[x][y]=='O') q.push(x*col+y);
while(!q.empty())
{
int tmp=q.front();
x=tmp/col;
y=tmp%col;
board[x][y]='D';
for(int i=0;i<4;i++)
{
int a=x+dir[i][0];
int b=y+dir[i][1];
if(a>=0&&a<row&&b>=0&&b<col&&board[a][b]=='O')
q.push(a*col+b);
}
}
}
};
1 试了几次还是错误。。。。。心累,下次在在找
2016 7.25
2 老是提示超时。问题是没有剪枝。
class Solution {
public:
void solve(vector<vector<char>>& board) {
if(!board.size()) return;
int row=board.size();
int col=board[0].size();
for(int j=0;j<col;j++)
{
dfs(board,0,j);//第一行
if(row>1)//若只有一行,就没有进行下去的理由
dfs(board,row-1,j);//最后一行
}
for(int i=1;i<row;i++ )
{
dfs(board,i,0);//第一列
if(col>1)//若只有一列,同理
dfs(board,i,col-1);//最后一列
}
for(int i=0;i<row;i++)//最后还原
for(int j=0;j<col;j++)//O转为x,D转为O
{
if(board[i][j]=='D')
board[i][j]='O';
else if(board[i][j]=='O')
board[i][j]='X';
}
}
void dfs(vector<vector<char> >&board,int i,int j)
{
//判断数组下标是否越界
if(i<0||i>=board.size()||j<0||j>=board[0].size()||board[i][j]!='O')
return ;
board[i][j]='D';
if(i>1)//大于一行
dfs(board,i-1,j);//left
if(i+1<board.size())
dfs(board,i+1,j);//right
if(j>1)//大于一列
dfs(board,i,j-1);//down
if(j+1<board[0].size())
dfs(board,i,j+1);//up
}
};
1 结论向量下标很重要。
参考资料:http://blog.youkuaiyun.com/u011095253/article/details/9158455