leetcode小白刷题之旅----959. Regions Cut By Slashes
仅供自己学习
题目:
In a N x N grid
composed of 1 x 1 squares, each 1 x 1 square consists of a /
, \
, or blank space. These characters divide the square into contiguous regions.
(Note that backslash characters are escaped, so a \
is represented as "\\"
.)
Return the number of regions.
思路:
一开始不知道应该怎么做。去看了各种题解,采用了查并集的解法。将1*1的方块分成(3*n)*(3*n)的小方块,n是grid.size()大小,为什么是3的倍数,因为这是保证了每块小方块组成的较大方块都能相对于对角线对称的最小倍数。根据输入的斜杠方向按照一定规律把对角线经过的方块的数据设为1,其余方块默认为0。因为每个对角线1都会将区域分割开来,所以遍历所有方块,一列一列的向下DFS,将0方块变为1方块,当遇到1后则返回,并向下一列重复DFS。这样则可获得一个被对角线分割的区域,且该区域小方块全变为了1,于是获得的区域数加一。将二维数组所有小方块遍历后即可获得所有分割区域。
代码:
1 class Solution { 2 public: 3 int regionsBySlashes(vector<string>& grid) { 4 int n=grid.size(),res=0; 5 vector<vector<int> > nums(3*n,vector<int> (3*n)); 6 for(int i=0;i<n;++i){ 7 for(int j=0;j<n;++j){ 8 if (grid[i][j] == '/') { //根据该规律将‘/’用数据为1的小方格代替 9 nums[i*3][j*3+2]=1; 10 nums[i*3+1][j*3+1]=1; 11 nums[i*3+2][j*3]=1; 12 } 13 else if(grid[i][j]=='\\'){ //同上 14 nums[i*3][j*3]=1; 15 nums[i*3+1][j*3+1]=1; 16 nums[i*3+2][j*3+2]=1; 17 } 18 } 19 } 20 for(int i=0;i<nums.size();++i){ 21 for(int j=0;j<nums.size();++j){ 22 if(nums[i][j]==0){ 23 DFS(nums,i,j); //遍历二维数组寻找都为0的小方格区域 24 ++res; 25 } 26 } 27 } 28 return res; 29 } 30 void DFS(vector<vector<int> >& nums,int i,int j){ 31 if(i>=0&&j>=0&&i<nums.size()&&j<nums.size()&&nums[i][j]==0) 32 { 33 nums[i][j]=1; 34 DFS(nums,i-1,j); //这4条DFS会将这个区域的所有行列都递归到并且改为1,且先遍历列 35 DFS(nums,i,j+1); 36 DFS(nums,i+1,j); 37 DFS(nums,i,j-1); 38 } 39 } 40 };