POJ 1324 Holedox Moving (状压BFS)】的更多相关文章

POJ 1324 Holedox Moving (状压BFS) Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 18091 Accepted: 4267 Description During winter, the most hungry and severe time, Holedox sleeps in its lair. When spring comes, Holedox wakes up, moves to the…
题目链接 有一个n*m(1<=n,m<=20)的网格图,图中有k堵墙和有一条长度为L(L<=8)的蛇,蛇在移动的过程中不能碰到自己的身体.求蛇移动到点(1,1)所需的最小步数. 显然用8个(x,y)来表示蛇的状态是不现实的(用哈希也很难存下,要么爆内存,要么超时),所以首先应当进行状态压缩.可以发现蛇的身体是连续的,因此可以用一个表示方向的向量来储存蛇身体的每个部分在它上个部分的哪个方向(只有头部用(x,y)表示),这样总状态数就变成了n*m*(2^((L-1)*2)),在可接受范围内了…
poj 1324 Holedox Moving 题目地址: http://poj.org/problem?id=1324 题意: 给出一个矩阵中,一条贪吃蛇,占据L长度的格子, 另外有些格子是石头, 不能通过, 请问蛇到达 (1,1)格子最短距离. 明显的BFS问题, 将每一个可以走的格子进入队列, 格子判断能否走?(给蛇身体标序号(蛇头l, 蛇尾1,其他置为0), 当 fabs(cur_num - tmp_num)>=l 的时候,说明蛇的身体已经离开之前的格子了. #include <ios…
题目地址: http://poj.org/problem?id=1324 优先队列---A*的估价函数不能为蛇头到(1,1)的距离,这样会出错. 看了discuss,有大神说这题A*的估价函数为BFS (0,0)到各点的花费在乘上10 ,但是还是不清楚,希望知道的可以给我留个言,谢谢了. 思路: 用0,1,2,3表示方向,这样就可以用四进制状态压缩了. 总共需要3+3*4^1+……3*4^6. 推荐大家能不用STL就不用STL,太浪费时间了. 下面是用STL超时代码和用数组模拟AC代码. 超时代…
1.状压bfs 这个状压体现在key上  我i们用把key状压一下  就能记录到一个点时 已经拥有的key的种类 ban[x1][y1][x2][y1]记录两个点之间的状态 是门 还是墙 还是啥都没有 inc[x][y]记录这个点所存储的钥匙  (可能不止一个 所以要用二进制) vis[x][y][key]  标记当前点 在拥有的钥匙种类为key时是否走过 #include <iostream> #include <cstdio> #include <sstream>…
P2622 关灯问题II 题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯——按下了第i个按钮,对于所有的灯都有一个效果.按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j]为1,那么当这盏灯开了的时候,把它关上,否则不管:如果为-1的话,如果这盏灯是关的,那么把它打开,否则也不管:如果是0,无论这灯是否开,都不管. 现在这些灯都是开的,给出所有开关对所有灯的控制效果,求问最少要按几下按钮才能全部关掉. 输入输出格式 输入格式: 前两行两个数,n m 接下来m行,每行n…
Paint on a Wall Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others)Total Submission(s): 830    Accepted Submission(s): 325 Problem Description Annie wants to paint her wall to an expected pattern. The wall can be repr…
状压BFS 注意在用二维字符数组时,要把空格.换行处理好. #include<stdio.h> #include<algorithm> #include<string.h> #include<queue> using namespace std; #define INF 0x3f3f3f3f int sx,sy,C,n,m; int ans; ][][<<]; ][]; ][]; ,,-,},dy[]={,,,-}; <=a&&am…
​题意:1个机器人找几个垃圾,求出最短路径. 状压BFS,这道题不能用普通BFS二维vis标记数组去标记走过的路径,因为这题是可以往回走的,而且你也不能只记录垃圾的数量就可以了,因为它有可能重复走同一个垃圾.其实解决的办法就是把vis标记数组开到3维,用来存每次走的状态.再通过位运算即可. 下面是2中常见的位运算操作: 1.加入某一个垃圾:rubblish | =( 1 << i ); eg: 0001 | 0100 =0101 ; 2.进行垃圾匹配 :if( (  rubblish &…
题目链接:http://poj.org/problem?id=3254 给你n*m的菜地,其中1是可以种菜的,而菜与菜之间不能相邻.问有多少种情况. 状压dp入门题,将可以种菜的状态用一个数的二进制表示.第i行的状态只与上一行有关. 此blog讲的很清楚:传送门 //#pragma comment(linker, "/STACK:102400000, 102400000") #include <algorithm> #include <iostream> #in…