题目及测试
package pid130;
/* 被围绕的区域
给定一个二维的矩阵,包含 'X' 和 'O'(字母 O)。
找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。
示例:
X X X X
X O O X
X X O X
X O X X
运行你的函数后,矩阵变为:
X X X X
X X X X
X X X X
X O X X
解释:
被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'。
任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为 'X'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
*/
import java.util.List;
public class main {
public static void main(String[] args) {
char[][] testTable = {
{'X','X','X','X'},{'X','O','O','X'},
{'X','X','O','X'},{'X','O','X','X'}};
test(testTable);
}
private static void test(char[][] ito) {
Solution solution = new Solution();
long begin = System.currentTimeMillis();
for(char[] now:ito){
for(char nowc:now){
System.out.print(nowc+" ");
}
System.out.println();
}
System.out.println();
//开始时打印数组
solution.solve(ito);//执行程序
long end = System.currentTimeMillis();
System.out.println("rtn=" );
for(char[] now:ito){
for(char nowc:now){
System.out.print(nowc+" ");
}
System.out.println();
}
System.out.println();
System.out.println();
System.out.println("耗时:" + (end - begin) + "ms");
System.out.println("-------------------");
}
}
解法1(成功,2ms,极快)
使用dfs递归,将边的O以及连接这些O变成A(相当于,没有与边上的O相连的O没有被改变,还是O,与边上的O相连的O变成A),然后遍历数组,将O变成X,A变成O
package pid130;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map.Entry;
public class Solution {
public void solve(char[][] board) {
int row=board.length;
if(row==0){
return;
}
int col=board[0].length;
if(col==0){
return;
}
if(row==1){
for(int i=0;i<col;i++){
solveOtoA(board, 0, i);
}
}
if(col==1){
for(int i=0;i<col;i++){
solveOtoA(board, i, 0);
}
}
// 第一行和最后一行
for(int i=0;i<col;i++){
solveOtoA(board, 0, i);
}
for(int i=0;i<col;i++){
solveOtoA(board, row-1, i);
}
// 第一列和最后一列(去掉头尾)
for(int i=1;i<row-1;i++){
solveOtoA(board, i, 0);
}
for(int i=1;i<row-1;i++