#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Solution {
public:
int** visited;
int *circle_r, *circle_c;
int st, ed, row, col;
void solve(vector<vector<char> > &board) {
int i, j, k;
int success;
row = board.size();
if (row == 0)
return;
col = board[0].size();
visited = new int*[row];
for (i = 0; i < row; i++) {
visited[i] = new int[col];
for (j = 0; j < col; j++)
visited[i][j] = 0;
}
circle_r = new int[row*col];
circle_c = new int[row*col];
for (int p = 0; p < row*col; p++) {
circle_r[p] = 0;
circle_c[p] = 0;
}
st = 0;
ed = 0;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
success = 1;
if (!visited[i][j] && board[i][j] == 'O') {
findCircle(board, i, j, success);
if (success) {
for (k = st; k < ed; k++) {
board[circle_r[k]][circle_c[k]] = 'X';
}
}
st = ed;
cout<<st<<endl;
}
}
}
}
void findCircle(vector<vector<char> > &board, int i, int j, int &success) {
if (i == row-1 || i == 0 || j == col-1 || j == 0)
success = 0;
visited[i][j] = 1;
circle_r[ed] = i;
circle_c[ed] = j;
ed++;
if (i > 0 && !visited[i-1][j] && board[i-1][j] == 'O')
findCircle(board, i-1, j, success);
if (i < row - 1 && !visited[i+1][j] && board[i+1][j] == 'O')
findCircle(board, i+1, j, success);
if (j > 0 && !visited[i][j-1] && board[i][j-1] == 'O')
findCircle(board, i, j-1, success);
if (j < col - 1 && !visited[i][j+1] && board[i][j+1] == 'O')
findCircle(board, i, j+1, success);
}
};
int main() {
vector<vector<char> > board;
vector<char> row;
char tmp0[] = {'O','O','O','O','O'};
row.assign(tmp0, tmp0+5);
board.push_back(row);
char tmp[] = {'O','X','X','X','O'};
row.assign(tmp, tmp+5);
board.push_back(row);
char tmp1[] = {'O','X','O','X','O'};
row.assign(tmp1, tmp1+5);
board.push_back(row);
char tmp2[] = {'O','X','X','X','O'};
row.assign(tmp2, tmp2+5);
board.push_back(row);
char tmp3[] = {'O','O','O','O','O'};
row.assign(tmp3, tmp3+5);
board.push_back(row);
Solution sl;
sl.solve(board);
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
cout<<board[i][j]<<" ";
}
cout<<endl;
}
for (int i = 0; i < 25; i++) {
cout<<sl.circle_r[i]<<" ";
}
cout<<endl;
for (int i = 0; i < 25; i++) {
cout<<sl.circle_c[i]<<" ";
}
cout<<endl;
cout<<"Hello World!"<<endl;
return 1;
}
111,1 Bot
First version is based on dfs. This code can work fine in my local machine, but encounter TLE in leetcode. This is because the stackoverflow problem when too many recursive functions are called.
Based on the suggestion from leetcode discussion board, another bfs version has been implemented as follows:
#include <iostream>
#include <vector>
#include <string>
#include <queue>
using namespace std;
class Solution {
public:
int *circle_r, *circle_c;
void solve(vector<vector<char> > &board) {
int **visited;
int st, ed, row, col;
int i, j, k, deq_r, deq_c;
int success;
queue<int> que_r;
queue<int> que_c;
row = board.size();
if (row == 0)
return;
col = board[0].size();
visited = new int*[row];
for (i = 0; i < row; i++) {
visited[i] = new int[col];
for (j = 0; j < col; j++) {
visited[i][j] = 0;
}
}
circle_r = new int[row*col];
circle_c = new int[row*col];
for (i = 0; i < row*col; i++) {
circle_r[i] = 0;
circle_c[i] = 0;
}
st = 0;
ed = 0;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
success = 1;
if (!visited[i][j] && board[i][j] == 'O') {
que_r.push(i);
que_c.push(j);
visited[i][j] = 1;
while (!que_r.empty()) {
deq_r = que_r.front();
que_r.pop();
deq_c = que_c.front();
que_c.pop();
if (deq_r == row - 1 || deq_r == 0 || deq_c == col - 1 || deq_c == 0)
success = 0;
circle_r[ed] = deq_r;
circle_c[ed] = deq_c;
ed++;
if (deq_r > 0 && !visited[deq_r-1][deq_c] && board[deq_r-1][deq_c] == 'O') {
que_r.push(deq_r-1);
que_c.push(deq_c);
visited[deq_r-1][deq_c] = 1;
}
if (deq_r < row - 1 && !visited[deq_r+1][deq_c] && board[deq_r+1][deq_c] == 'O') {
que_r.push(deq_r+1);
que_c.push(deq_c);
visited[deq_r+1][deq_c] = 1;
}
if (deq_c > 0 && !visited[deq_r][deq_c-1] && board[deq_r][deq_c-1] == 'O') {
que_r.push(deq_r);
que_c.push(deq_c-1);
visited[deq_r][deq_c-1] = 1;
}
if (deq_c < col - 1 && !visited[deq_r][deq_c+1] && board[deq_r][deq_c+1] == 'O') {
que_r.push(deq_r);
que_c.push(deq_c+1);
visited[deq_r][deq_c+1] = 1;
}
}
if (success) {
for (k = st; k < ed; k++) {
board[circle_r[k]][circle_c[k]] = 'X';
}
}
st = ed;
}
}
}
}
};