[leetcode]Regions Cut By Slashes-DFS

Regions Cut By Slashes

题目

leetcode入口

思考

这道题的难点在于把问题抽象为求解连通分量个数的题,并且要知道如何建图

将一个正方形方格分成四个三角形部分记为0,1,2,3,分别对应左边,下边,右边,上边的三角形。

不论是什么输入(暂不考虑边界情况)
该正方形的1都能与下面的正方形的3连接
该正方形的2都能与右边的正方形的0连接

分情况
输入" ":
连接0-3 1-2 0-1 2-3

输入"\"
连接0-1,2-3

输入"/"
连接0-3,1-2

代码(dfs)

class Solution {
public:
    void connect(vector<vector<int>> &graph,int a,int b){
        graph[a].push_back(b);
        graph[b].push_back(a);
    }
    
    void dfs(int i,vector<bool>& visited,vector<vector<int>>& graph){
        for(int j=0;j<graph[i].size();j++){
            if(!visited[graph[i][j]]){
                visited[graph[i][j]]=true;
                dfs(graph[i][j],visited,graph);
            }
        }
    }
    
    int regionsBySlashes(vector<string>& grid) {
        vector<vector<int>> graph(grid.size()*grid.size()*4,vector<int>());
        
        int N=grid.size();
        int n=0;
        int n1=0;
        
        //构造初始的连接
        for(int i=0;i<grid.size();i++){
            for(int j=0;j<grid[0].size();j++){
                n=4*(i*N+j);
                if(i<N-1){
                    //当前框编号
                    
                    //当前框下面的框
                    n1=4*((i+1)*N+j);
                    connect(graph,n+1,n1+3);
                }
                if(j<N-1){
                    //当前框右面的框
                    n1=4*(i*N+j+1);
                    connect(graph,n+2,n1);
                }
            }
        }
        
        //根据输入构造连接
        for(int i=0;i<grid.size();i++){
            for(int j=0;j<grid[0].size();j++){
                //当前框编号
                n=4*(i*N+j);
                if(grid[i][j]!='\\'){
                    connect(graph,n,n+3);
                    connect(graph,n+1,n+2);
                }
                if(grid[i][j]!='/'){
                    connect(graph,n,n+1);
                    connect(graph,n+2,n+3);
                }
            }
        }
        
        vector<bool> visited(4*N*N,0);
        int cnt=0;
        for(int i=0;i<4*N*N;i++){
            if(!visited[i]){
                visited[i]=true;
                dfs(i,visited,graph);
                cnt++;
            }
        }
        return cnt;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值