zoukankan      html  css  js  c++  java
  • Leetcode: Surrounded regions

    
    

    Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'.

    
    

    A region is captured by flipping all 'O's into 'X's in that surrounded region .

    
    

    For example,

    
    
    X X X X
    X O O X
    X X O X
    X O X X
    
    

    After running your function, the board should be:

    
    
    X X X X
    X X X X
    X X X X
    X O X X
     

    我的最初思路是直接找被包围的O区域,如果这个区域不与边界接触则是被包围区域,但是这种判断要等到dfs完成才能知道是否是被包围区域,所以需要再一次dfs来将这些点变成'X'。所以这样的复杂度太高,Judge Large超时。这个版本的代码包括下面的dfs和changeBoard,以及Solve中被注释掉的部门代码;后来参考了网上的一个代码,将思路转变为先对不被包围的区域做标记'C',然后再遍历一遍按要求修改。这样就避免了做两遍深度搜索。

    代码如下:(有点难看,见谅……)

      1 //
      2 //  SurroundedRegions.cpp
      3 //  SJMcode
      4 //
      5 //  Created by Jiamei Shuai on 13-8-30.
      6 //  Copyright (c) 2013年 Jiamei Shuai. All rights reserved.
      7 //
      8 
      9 
     10 #include <iostream>
     11 #include <vector>
     12 #include <assert.h>
     13 using namespace std;
     14 
     15 class Solution {
     16 public:
     17     
     18     void dfs2(vector<vector<char>> &board, int i, int j)
     19     {
     20         if(i > board.size()-1 || i < 0 || j > board[0].size()-1 || j < 0)
     21             return;
     22         
     23         if(board[i][j] == 'O')
     24         {
     25             board[i][j] = 'C';
     26             dfs2(board, i+1, j);
     27             dfs2(board, i-1, j);
     28             dfs2(board, i, j-1);
     29             dfs2(board, i, j+1);
     30         }
     31             
     32 
     33     }
     34     
     35     bool dfs(vector<vector<char>> &board, int i, int j, int height, int width, vector<vector<int>> &isVis, bool &flag) // working but too slow
     36     {
     37         //if(board[i][j] == 'X')  return true;
     38         
     39         if(i == height-1 || i == 0 || j == width-1 || j == 0)
     40             flag = false; // 'o' touch the border: means this block cannot be the answer
     41         
     42         isVis[i][j] = 1;
     43         
     44         
     45         if(i >= 1 && !isVis[i-1][j] && board[i-1][j] == 'O')
     46         {
     47             dfs(board, i-1, j, height, width, isVis, flag); //
     48         }
     49         if(i < (int)board.size()-1 && !isVis[i+1][j] && board[i+1][j] == 'O')
     50         {
     51             dfs(board, i+1, j, height, width, isVis, flag); //
     52         }
     53         if(j >= 1 && !isVis[i][j-1] && board[i][j-1] == 'O')
     54         {
     55             dfs(board, i, j-1, height, width, isVis, flag); //
     56         }
     57         if(j < (int)board[0].size() && !isVis[i][j+1] && board[i][j+1] == 'O')
     58         {
     59             dfs(board, i, j+1, height, width, isVis, flag); //
     60         }
     61         
     62         return flag;
     63     }
     64     
     65     void changeBoard(vector<vector<char>> &board, int i, int j) // working but too slow
     66     {
     67         vector<int> queue;
     68         board[i][j] = 'X';
     69         assert(i > 0 && i < board.size()-1 && j > 0 && j < board[0].size()-1);
     70         if(board[i-1][j] == 'O')
     71             changeBoard(board, i-1, j);
     72         if(board[i+1][j] == 'O')
     73             changeBoard(board, i+1, j);
     74         if(board[i][j-1] == 'O')
     75             changeBoard(board, i, j-1);
     76         if(board[i][j+1] == 'O')
     77             changeBoard(board, i, j+1);
     78     }
     79     
     80     void solve(vector<vector<char>> &board) {
     81         // Start typing your C/C++ solution below
     82         // DO NOT write int main() function
     83         int height = (int)board.size();
     84         if(height == 0) return;
     85         int width = (int)board[0].size();
     86         
     87 //        vector<int> temp(width, 0);
     88 //        
     89 //        vector<vector<int>> isVis(height, temp);
     90 //        bool flag = true;
     91 //        
     92 //        for(int i = 0; i < height; i++)
     93 //        {
     94 //            for(int j = 0; j < width; j++)
     95 //            {
     96 //                if(board[i][j] == 'O' && !isVis[i][j])
     97 //                {
     98 //                    flag = true;
     99 //                    if(dfs(board, i, j, height, width, isVis, flag)) // surround regions
    100 //                    {
    101 //                        changeBoard(board, i, j);  // Find surround region directly may cause runtime error
    102 //                    }
    103 //                }
    104 //            }
    105 //        }
    106         
    107         // Change my strategy to mark unsurrounded regions
    108         
    109         for(int i = 0; i < height; i++)
    110         {
    111             dfs2(board, i, 0);
    112             dfs2(board, i, width-1);
    113         }
    114         
    115         for(int j = 0; j < width; j++)
    116         {
    117             dfs2(board, 0, j);
    118             dfs2(board, height-1, j);
    119         }
    120         
    121         for(int i = 0; i < height; i++)
    122         {
    123             for(int j = 0; j < width; j++)
    124             {
    125                 if(board[i][j] == 'O') board[i][j] = 'X';
    126                 if(board[i][j] == 'C') board[i][j] = 'O';
    127             }
    128         }
    129         
    130         // print result
    131         for(int i = 0; i < height; i++)
    132         {
    133             for(int j = 0; j < width; j++)
    134             {
    135                 cout << board[i][j] << ' ';
    136             }
    137             cout << endl;
    138         }
    139         
    140     }
    141     
    142 };
    143 
    144 int main()
    145 {
    146     vector<vector<char>> board{{'X','X','X','X'},{'X','O','O','X'},{'X','X','O','X'},{'X','O','X','X'}};
    147     
    148     
    149     Solution sln;
    150     sln.solve(board);
    151     
    152     return 0;
    153 }
    View Code

     此外,提交的代码是不能有输出语句的,否则会报Internal Error。

     BFS也可以做:http://blog.sina.com.cn/s/blog_b9285de20101j1dt.html

  • 相关阅读:
    5 TensorFlow入门笔记之RNN实现手写数字识别
    用python简便地抓取刘昊然的写真(17行代码)
    MFC实现简单飞机大战(含游戏声音)
    4 TensorFlow入门之dropout解决overfitting问题
    3 TensorFlow入门之识别手写数字
    2 TensorFlow入门笔记之建造神经网络并将结果可视化
    1 TensorFlow入门笔记之基础架构
    用python的turtle画分形树
    win10下安装TensorFlow(CPU only)
    python中math常用函数
  • 原文地址:https://www.cnblogs.com/avril/p/3292281.html
Copyright © 2011-2022 走看看