打开这个题,做了一半躺下了。
结果,怎么都睡不着。一会一个想法,忍不住爬起来提交,要么错误,要么超时。
按照常规思路,依次对每个点检测是否是闭包,再替换,超时。计算量太大了。
还能怎么做呢?没思路,关机睡觉!
躺着睡不着了,思考吧。。。闭着眼睛运行代码。。
突然灵机一动,可以反着来啊!
先把非法的干掉,剩下的就是合法的,不再检测,直接替换就可以了。
而且用到了我平时编辑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); }