问题:
给定一个n*m数组,代表公路。
- 1:连接 left + right
- 2:连接 up + down
- 3:连接 left + down
- 4:连接 right + down
- 5:连接 left + up
- 6:连接 right + up
求是否能够从左上角格子(0,0)到达,右下角(n-1,m-1)。
example 1:
example 2:
解法:BFS ,Union Find
解法一:BFS:
- 状态:当前位置坐标。
- visited也标记已访问过的坐标。
- 选择:next=当前格子所连接的两个方向。
- 除去:next:超出边界 or 已访问过位置 or 当前位置cur:不位于next的连接方向上。
- op[cur].count(grid[next])==0
- 除去:next:超出边界 or 已访问过位置 or 当前位置cur:不位于next的连接方向上。
代码参考:
解法二:Union Find
将每个cell的边+cell中心,都看作一个node,
那么每个街道的布局即可看作,将中心和其中两个边 代表的node 相连。
例如:
3:连接 left + down
- 假设中心为(i,j)
- left边为(i,j-1)
- down边为(i+1,j)
布局3则可看作,将上述三个节点相连。
根据题意,对于节点(i,j)
按照上述方法进行标记节点的话,其节点坐标为(i*2,j*2)
那么对于(0,0) 中心节点坐标为(0,0)上边(-1,0)左边(0,-1)
整个地图的上边界和左边界都为-1,而我们只要求中心节点:起始(0,0)~终点((n-1)*2, (m-1)*2),也用不到-1的节点,因此不计算在内也完全可以。
使用union find方法,
那么共有2n*2m个节点。
构造记录root数组 uf[n][m]
初始化为各自坐标自己。
实现find,merge方法:
再利用union find进行对本问题的求解。
对每个cell,根据道路布局,进行节点merge
最后所求即是,起始节点和终点是否为同一个root。
代码参考: