广搜-状态压缩

(以下是个人理解,欢迎指正!)       



        这几天做了几个状态压缩的题,做一下笔记。

        求最短路径或最短时间,即求最优解时,若其中某些条件的状态不好记录,可以试试状态压缩的思想。

        比如 poj-1324 Holedox Moving , 这个题每走一步都要记录当前蛇的状态,需要判断头是否会咬到自己的身体,以及判断当前位置是否以同样的状态访问过,刚开始没接触过状态压缩思想时觉得一筹莫展,后来接触之后发现其实并不是很难。蛇的身体是一节一节连起来的,我们应该怎么记录它的状态呢,用一个三维数组vis[x][y][state]来记录,xy表示蛇头的坐标,state表示蛇的身体的状态,记录的是方向,蛇的身体的后一节相对于前一节的方向,比如说二进制的01表示在前一节的上方,10表示在前一节的下方,00表示在前一节的左边,11表示在前一节的右边,一条蛇坐标为:0 0 , 0 1 , 1 1,1 0,则它身体的状态state(二进制)=111000(右下左),此时vis[0][0][56]=1 ;

         如果上一个看的不太明白,可以看这个 胜利大逃亡(续)hdu-1429,这个题的状态存储比上一个简单一点。这个题只需要存储钥匙的状态即可,当找到某把钥匙时就将此钥匙放入状态中,若找到a钥匙,sta=1<<(a-'a') , 再将此时的sta存入总状态中:state=state|sta 即可。

         下面贴两个题可以先试着做一下:

           胜利大逃亡(续)hdu-1429                      题解:点我 ! QAQ..

           Saving Tang Monk HDU - 5025               题解:还是点我叭

        


猜你喜欢

转载自blog.csdn.net/mjj1024/article/details/80171475