avatar
发火鸡了吗?# Joke - 肚皮舞运动
h*i
1
O(n*n)怎么也过不了large test?
void solve(vector> &board) {
int m = board.size();
if (m == 0) return;
int n = board[0].size();
unordered_set checked;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (board[i][j] == 'X') continue;
if (checked.find(i * n + j) != checked.end()) continue;
unordered_set s;
queue q;
s.insert(i * n + j);
q.push(i * n + j);
bool fill = true;
while (!q.empty()) {
int k = q.front();
q.pop();
int jj = k % n;
int ii = k / n;
checked.insert(ii * n + jj);
if (ii == 0 || ii == m - 1 || jj == 0 || jj == n - 1)
fill = false;
if (ii + 1 < m && board[ii+1][jj] == 'O') {
s.insert((ii + 1) * n + jj);
q.push((ii + 1) * n + jj);
}
if (jj + 1 < n && board[ii][jj+1] == 'O') {
s.insert(ii* n + jj + 1);
q.push(ii * n + jj + 1);
}
}
if (fill) {
for (unordered_set::iterator it = s.begin();
it != s.end(); ++it) {
int k = *it;
int jj = k % n;
int ii = k / n;
board[ii][jj] = 'X';
}
}
}
}

}
avatar
j*c
2
rt
avatar
m*d
3
还是我又来晚了?
avatar
v*l
5
木有。
avatar
t*Q
6
版主,今年养鸡了吗?

【在 m*****d 的大作中提到】
: 还是我又来晚了?
avatar
p*e
7
我的也不行,怎么检查代码都出错,小数据没问题
avatar
S*t
8
没。
avatar
f*t
9
什么错?

【在 p****e 的大作中提到】
: 我的也不行,怎么检查代码都出错,小数据没问题
avatar
k*n
10
大家给包子机一点时间

【在 j****c 的大作中提到】
: rt
avatar
l*i
11
judge does not like dfs, seems recursion depth is huge. Use bfs should work.
My code for reference:
class Solution {
public:
void dfs(char marker, int r, int c, vector > &board)
{
board[r][c] = marker;
int n = board.size(), m = board[0].size();
int d[][2] = {{-1,0}, {0,+1}, {+1,0}, {0,-1}};
queue > que;
que.push(make_pair(r,c));
while (!que.empty()) {
pair p = que.front(); que.pop();
int i = p.first, j = p.second;
for (int x = 0; x < 4; ++x) {
int i2, j2;
i2 = i + d[x][0]; j2 = j + d[x][1];
if (0 <= i2 && i2 < n && 0 <= j2 && j2 < m
&& board[i2][j2] == 'O') {
board[i2][j2] = marker; que.push(make_pair(i2,j2));
}
}
}
// judge does not like dfs
/*
for (int x=0; x<4; ++x) {
int i = r + d[x][0];
int j = c + d[x][1];
if (0 <= i && i < n && 0 <= j && j < m && board[i][j] == 'O') {
dfs(marker, i, j, board);
}
} */
}

void solve(vector> &board) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if (board.empty()) return;
// start from border, mark all O, then set all other O to X
int n = board.size(), m = board[0].size();
const char marker = 'T';
for (int j=0; jint i;
i = 0; if (board[i][j] == 'O') dfs(marker, i, j, board);
i = n-1; if (board[i][j] == 'O') dfs(marker, i, j, board);
}
for (int i=0; iint j;
j = 0; if (board[i][j] == 'O') dfs(marker, i, j, board);
j = m-1; if (board[i][j] == 'O') dfs(marker, i, j, board);
}
for (int i=0; ifor (int j=0; jif (board[i][j] == marker) board[i][j] = 'O';
else if (board[i][j] == 'O') board[i][j] = 'X';
}
};
avatar
f*p
12


【在 j****c 的大作中提到】
: rt
avatar
p*2
13

work.
LZ的不是dfs吧?我倒是在你的code里边看到dfs了。

【在 l***i 的大作中提到】
: judge does not like dfs, seems recursion depth is huge. Use bfs should work.
: My code for reference:
: class Solution {
: public:
: void dfs(char marker, int r, int c, vector > &board)
: {
: board[r][c] = marker;
: int n = board.size(), m = board[0].size();
: int d[][2] = {{-1,0}, {0,+1}, {+1,0}, {0,-1}};
: queue > que;

avatar
j*3
14
re

【在 j****c 的大作中提到】
: rt
avatar
h*i
15
你的这个从四边往中间走的思路好,什么都不用记了。

【在 p*****2 的大作中提到】
:
: work.
: LZ的不是dfs吧?我倒是在你的code里边看到dfs了。

avatar
j*c
16
包子机是啥东东?我每次都是手动发包子,累死

【在 k*****n 的大作中提到】
: 大家给包子机一点时间
avatar
h*i
17
贴个旁门左道。 88 milli secs过large test.
typedef struct FU {
int parent;
bool fill;
int rank;
FU(int v, bool f)
: parent(v),
fill(f),
rank(0) {
}
} FU;

int find(int i, vector &v) {
if (v[i].parent == i) return i;
v[i].parent = find(v[i].parent, v);
return v[i].parent;
}

void union_by_rank(int i, int j, vector &v) {
int k = find(i, v);
int l = find(j, v);
if (k == l) return;
if (v[k].rank < v[l].rank) {
v[k].parent = l;
if (v[k].fill == false) v[l].fill = false;
}
else if (v[k].rank > v[l].rank) {
v[l].parent = k;
if (v[l].fill == false) v[k].fill = false;
}
else {
v[l].parent = k;
v[k].rank += 1;
if (v[l].fill == false) v[k].fill = false;
}

}

void solve(vector> &board) {
int m = board.size();
if (m == 0) return;
int n = board[0].size();
vector v;
for (int i = 0; i < m; ++i)
for (int j = 0; j < n; ++j)
v.push_back(FU(i * n + j, true));
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (board[i][j] == 'X') continue;
int index = i * n + j;
if (i + 1 < m && board[i + 1][j] == 'O')
union_by_rank(index + n, index, v);
if (j + 1 < n && board[i][j + 1] == 'O')
union_by_rank(index, index + 1, v);
if (i == 0 || i == m - 1 || j == 0 || j == n - 1) {
int l = find(index, v);
v[l].fill = false;
}
}
}

for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (board[i][j] == 'X') continue;
int l = find(i * n + j, v);
if (v[l].fill)
board[i][j] = 'X';
}
}
}

【在 h***i 的大作中提到】
: 你的这个从四边往中间走的思路好,什么都不用记了。
avatar
L*k
18
有两种。
一种是抢包子的
一种是发包子的

【在 j****c 的大作中提到】
: 包子机是啥东东?我每次都是手动发包子,累死
avatar
w*a
19
其实可以用01稀疏矩阵里找连续的的1的方法。贴个我的代码。注意因为输入的是char
类型的矩阵,所以这个只能过小集合。简单改一下用int矩阵存起来就能过大集合了。
时间复杂度O(m*n)
class Solution {
public:
void solve(vector> &board) {

int m = board.size();
if(m <= 1) return;
int n = board[0].size();
if(n <= 1) return;

char count = 0;
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
if(board[i][j] == 'O')
board[i][j] = ++count;

set margins;

for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
if(board[i][j] != 'X'){
if(i!=0 && board[i-1][j] != 'X')
board[i][j] = board[i-1][j];
else if(j!=0 && board[i][j-1] != 'X')
board[i][j] = board[i][j-1];

if(i==0 || i==m-1 || j==0 || j==n-1)
margins.insert(board[i][j]);
}

for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
if(board[i][j] != 'X')
if(margins.find(board[i][j])!=margins.end())
board[i][j] = 'O';
else
board[i][j] = 'X';

}
};
avatar
b*n
20
no
avatar
l*i
21
比较懒,dfs改成了bfs,不过function还是叫dfs
我觉得自己用stack做nonrecursive的dfs也能过,不过没试

【在 p*****2 的大作中提到】
:
: work.
: LZ的不是dfs吧?我倒是在你的code里边看到dfs了。

avatar
a*9
22
这个还re啊。。服了。

【在 j******3 的大作中提到】
: re
avatar
p*2
23

应该能过。

【在 l***i 的大作中提到】
: 比较懒,dfs改成了bfs,不过function还是叫dfs
: 我觉得自己用stack做nonrecursive的dfs也能过,不过没试

avatar
k*o
24
Having issues with 包子机, and was pretty busy with work, please be patient~
~~
avatar
d*g
25
re

patient~

【在 k**o 的大作中提到】
: Having issues with 包子机, and was pretty busy with work, please be patient~
: ~~

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。