打开这个题,做了一半躺下了。

结果,怎么都睡不着。一会一个想法,忍不住爬起来提交,要么错误,要么超时。

按照常规思路,依次对每个点检测是否是闭包,再替换,超时。计算量太大了。

还能怎么做呢?没思路,关机睡觉!

躺着睡不着了,思考吧。。。闭着眼睛运行代码。。

突然灵机一动,可以反着来啊!

先把非法的干掉,剩下的就是合法的,不再检测,直接替换就可以了。

而且用到了我平时编辑Word常用的方式,先用一个mark来保护不应该替换的!

哈哈  巧妙!

 

按耐不住,再次爬起来,1分钟敲完代码,提交,AC!激动!

 

大半夜的做题,我也是疯魔了。。老天看在我这么努力的份上。。让我赶紧开窍吧!

为啥是B,因为代表bad blocks~~

void fill_with_b(char **board, int i, int j, int m, int n)
{
    if(i < 0 || i > m-1 || j < 0 || j > n-1) return;
    if(board[i][j] == 'O')
    {
        board[i][j] = 'B';
        fill_with_b(board,i+1,j,m,n);
        fill_with_b(board,i-1,j,m,n);
        fill_with_b(board,i,j-1,m,n);
        fill_with_b(board,i,j+1,m,n);
    }
}
void replace_b(char **board, int m, int n)
{
    int i, j;
    for(i = 0; i < m; i++)
    {
        for(j = 0; j < n; j++)
        {
            if(board[i][j] == 'B') 
            {
                board[i][j] = 'O';
            }
        }
    }
}
void solve(char** board, int m, int n) {
    
    if(board == NULL || m*n ==0)    return;
    if(m < 3 || n < 3)  return;
    
    int i,j;
    
    for(i = 0; i < m; i++)
    {
        if(board[i][0] == 'O')
            fill_with_b(board,i,0,m,n);
        if(board[i][n-1] == 'O')
            fill_with_b(board,i,n-1,m,n);
    }
    
    for(j = 0; j < n ; j++)
    {
        if(board[0][j] == 'O') 
            fill_with_b(board,0,j,m,n);
        if(board[m-1][j] == 'O') 
            fill_with_b(board,m-1,j,m,n);
    }
    
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            if(board[i][j] == 'O')
                board[i][j] = 'X';
        }
    }
    replace_b(board,m,n);
    
}

 

posted on 2017-12-16 02:54  newbird2017  阅读(118)  评论(0编辑  收藏  举报