题目
一块矩形土地被分为N*M的单位正方形,现在这块土地上已经埋设有一些水管,水管将从坐标为(1,1)左上角左部边缘,延伸到(N,M)右下角右部边缘。每种管道将占据一个单位正方形土地。你现在可以旋转这些管道,使得构成一个管道系统,即创造一条从(1,1)到(N,M)的连通管道。标有树木的方格表示这里没有管道。障碍物用0表示。我们可以旋转其中的一些管道,使之构成一个连通的管道系统。如果通过旋转管道可以使之构成一个连通的管道系统,就输出铺设的路径,否则输出impossible。
输入
例如:
5 4
5 3 5 3
1 5 3 0
2 3 5 1
6 1 1 5
1 5 5 4
输出
(1,1)(1,2)(2,2)(3,2)(3,3)(3,4)(4,4)(5,4)
代码
1 | #include<iostream> |
思想
对于这种找到路径的问题,我们第一想法就是广搜和深搜。那么这个游戏的方法,我们可以从入水口判断出下一个水管是什么样的,所以用广搜的话,会多出一些没有用的判断,浪费一些时间,虽然对于电脑来说没有多大的影响,而且这种游戏也不会将地图设置多大,但是能用深搜何必用广搜呢。
然后首先考虑递归需要迭代的参数,首先这种地图肯定坐标是要递归的,其次我们需要上一次的接水管的方向,这样递归就有一个问题,就是最后的水管要匹配两个方向,一个是入水口,一个是出水口。我们可以将最后的水管外面那个当成一个水管,那么最后一个就不用特殊处理了,但是如果把地图外的当成水管,那么判断超界又有问题了,所以必须把赢得判断放在超界的判断上面。