DFS中的奇偶剪枝学习笔记
奇偶剪枝学习笔记
描述
s
|
||||
|
|
||||
|
|
||||
|
|
||||
+
|
—
|
—
|
—
|
e
|
s
|
—
|
—
|
—
|
|
—
|
—
|
+
|
||
|
|
+
|
|||
|
|
||||
+
|
—
|
—
|
—
|
e
|
结论
编辑原理补充
编辑
0
|
1
|
0
|
1
|
0 |
1 |
0
|
1
|
0
|
1 |
0
|
1
|
0 | 1 | 0 |
1
|
0 | 1 | 0 | 1 |
0
|
1
|
0
|
1
|
0
|
s
|
—
|
—
|
—
|
|
—
|
—
|
+
|
||
|
|
+
|
|||
|
|
||||
+
|
—
|
—
|
—
|
e
|
s
|
—
|
—
|
—
|
|
—
|
—
|
+
|
||
|
|
+
|
|||
|
|
+ | — | e | |
+
|
—
|
—
|
0
|
1
|
0
|
1
|
0 |
1 |
0
|
1
|
0
|
1 |
0
|
1
|
0 | 1 | 0 |
1
|
0 | 1 | 0 | 1 |
0
|
1
|
0
|
1
|
0
|
s
|
+ | |||
+
|
— | |||
| | ||||
+ | — | |||
—
|
—
|
e
|
ans=t-time-abs(dx-x)-abs(dy-y); if(ans<0||ans&1) return;
说了这么多,再总结一下吧!
什么是奇偶剪枝?
把矩阵看成如下形式:
0 1 0 1 0 1
1 0 1 0 1 0
0 1 0 1 0 1
1 0 1 0 1 0
0 1 0 1 0 1
从为 0 的格子走一步,必然走向为 1 的格子 。
从为 1 的格子走一步,必然走向为 0 的格子 。
即:
从 0 走向 1 必然是奇数步,从 0 走向 0 必然是偶数步。
所以当遇到从 0 走向 0 但是要求时间是奇数的或者 从 1 走向 0 但是要求时间是偶数的,都可以直接判断不可达!
比如有一地图:
S...
....
....
....
...D
要求从S点到达D点,此时,从S到D的最短距离为s = abs ( dx - sx ) + abs ( dy - sy )。
如果地图中出现了不能经过的障碍物:
S..X
XX.X
...X
.XXX
...D
此时的最短距离s' = s + 4,为了绕开障碍,不管偏移几个点,偏移的距离都是最短距离s加上一个偶数距离。
就如同上面说的矩阵,要求你从0走到0,无论你怎么绕,永远都是最短距离(偶数步)加上某个偶数步;要求你从1走到0,永远只能是最短距离(奇数步)加上某个偶数步。
这里我来讲一下搜索中要用到的奇偶剪枝的原理:
看张图,没障碍物#时,S到E的最短路长为6,但是当有障碍物时,就要绕行了
看这张图,黑色为最短路径,当他绕行(红色加蓝色部分)时,其中蓝色部分其实还是最短路径部分平移来的,所以多走的步数也就是红色部分
对于红色部分我们可以分为两部分,一部分是远离最短路径的步数,另一部分是回到最短路径的部分,他们一定是对称的,所以多走的步数一定是偶数!!!
所以要是问走x步能否到达e,就算出最短路径长y,如果x-y是偶数就能到达,否则不能到达!
作 者:Angel_Kitty
出 处:https://www.cnblogs.com/ECJTUACM-873284962/
关于作者:阿里云ACE,目前主要研究方向是Web安全漏洞以及反序列化。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!
欢迎大家关注我的微信公众号IT老实人(IThonest),如果您觉得文章对您有很大的帮助,您可以考虑赏博主一杯咖啡以资鼓励,您的肯定将是我最大的动力。thx.
我的公众号是IT老实人(IThonest),一个有故事的公众号,欢迎大家来这里讨论,共同进步,不断学习才能不断进步。扫下面的二维码或者收藏下面的二维码关注吧(长按下面的二维码图片、并选择识别图中的二维码),个人QQ和微信的二维码也已给出,扫描下面👇的二维码一起来讨论吧!!!
欢迎大家关注我的Github,一些文章的备份和平常做的一些项目会存放在这里。