hdu4845 状态压缩搜索水题

这道题简单来说是和胜利大逃亡续类似的题  只不过这道题没有给你明确的地图 只给了你点之间的关系          唯一的坑点在于一个点可能有多把钥匙

#include<stdio.h>

#include<string.h>

#include<iostream>

#include<queue>

using namespace std;

struct node

{

int x,y,step,state;

}a,b;

int mark[16][16][3030];

int n,m,p;

int wall[16][16][16][16],key[16][16][15],flash;

int dis[4][2]={0,1,0,-1,1,0,-1,0};

int bfs()

{

int i,j;

a.x=1;

a.y=1;

a.state=0;

if(key[a.x][a.y][0]!=0)

{

//a.state=(1<<key[a.x][a.y]);

for(j=1;j<=key[a.x][a.y][0];j++)

{

a.state=a.state|(1<<key[a.x][a.y][j]);

}

}

a.step=0;

memset(mark,0,sizeof(mark));

mark[a.x][a.y][a.state]=1;

queue<node>q;

q.push(a);

while(!q.empty())

{

b=q.front();

q.pop();

if(b.x==n&&b.y==m)

{

printf("%d\n",b.step);

flash=1;

return 0;

}

for(i=0;i<4;i++)

{

a.x=b.x+dis[i][0];

a.y=b.y+dis[i][1];

a.step=b.step+1;

int t=b.state;

if(a.x<1||a.x>n||a.y<1||a.y>m) continue;

if(wall[b.x][b.y][a.x][a.y]==0) continue;

else if(wall[b.x][b.y][a.x][a.y]<0)

{

if(key[a.x][a.y][0])

{

for(j=1;j<=key[a.x][a.y][0];j++)

{

t=t|(1<<key[a.x][a.y][j]);

}

}

if(mark[a.x][a.y][t]==0)

{

mark[a.x][a.y][t]=1;

a.state=t;

q.push(a);

}

}

else

{

int x=1<<wall[b.x][b.y][a.x][a.y];

if(t&x)

{

if(key[a.x][a.y][0])

{

for(j=1;j<=key[a.x][a.y][0];j++)

{

t=t|(1<<key[a.x][a.y][j]);

}

}

if(mark[a.x][a.y][t]==0)

{

mark[a.x][a.y][t]=1;

a.state=t;

q.push(a);

}

}

}

}

}

return 0;

}

int main()

{

int i,j,k,x,x1,x2,y1,y2,y,z;

while(~scanf("%d%d%d",&n,&m,&p))

{

memset(wall,-1,sizeof(wall));

memset(key,0,sizeof(key));

scanf("%d",&k);

for(i=1;i<=k;i++)

{

scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&x);

wall[x1][y1][x2][y2]=wall[x2][y2][x1][y1]=x;

}

scanf("%d",&k);

for(i=1;i<=k;i++)

{

scanf("%d%d%d",&x,&y,&z);

key[x][y][0]++;

int s=key[x][y][0];

key[x][y][s]=z;

}

flash=0;

bfs();

if(!flash) printf("-1\n");

}

return 0;

}

时间: 2024-07-30 03:37:01

hdu4845 状态压缩搜索水题的相关文章

【BZOJ1087】【SCOI2005】互不侵犯King 状态压缩 动态规划 水题 都不用加特技

广告: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/44022265"); } 题解: 一开始让我写这道题,其实我是,是接受的. BalaBala. 毕竟水题,都不用特技. 裸状压DP. 直接f[i][j][k]表示第i行状态时j,有k个落子时的方案数. 代码: #include <

HDU 1885 Key Task 状态压缩+搜索

点击打开链接 Key Task Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1176    Accepted Submission(s): 462 Problem Description The Czech Technical University is rather old - you already know that it c

Hdu-1565 方格取数(1) (状态压缩dp入门题

方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4702    Accepted Submission(s): 1782 Problem Description 给你一个n*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出

华为题 搜索水题 DFS

1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <string> 6 #include <iterator> 7 #include <algorithm> 8 #include <cstdlib> 9 #include <deque> 10 #include &l

POJ 1632 Vase collection【状态压缩+搜索】

题目传送门:http://poj.org/problem?id=1632 Vase collection Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2308   Accepted: 901 Description Mr Cheng is a collector of old Chinese porcelain, more specifically late 15th century Feng dynasty vase

Poj 1185 炮兵阵地(状态压缩dp 入门题)

炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17272   Accepted: 6593 Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图.在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队):一支炮兵部队在地图上的攻击

Codeforces3C. Tic-tac-toe 题解 状态压缩+搜索

题目链接:https://codeforces.com/contest/3/problem/C 题目大意: 有一个 \(3 \times 3\) 的棋盘,给你一个棋盘当前的状态,请你输出当前这个状态对应的描述. 解题思路: \(3 \times 3\) 的棋盘上一共有9个位置,每个位置只有可能是3种状态:"."."0"或"X". 所以总的状态数有 \(3^9\) 种,我们可以从初始状态开始来搜索遍历得到所有的状态对应的描述(如果一个状态通过搜索遍

JZYZOJ 1385 拉灯游戏 状态压缩 搜索

http://172.20.6.3/Problem_Show.asp?id=1385 刚开始想的时候一直以为同一排不同的拉灯顺序对结果是有影响的,手推了好多遍才发现拉灯结果只和拉的灯有关,这也要打表,可以说非常智障了. 如果从上向下寻找拉的灯,那么每一排全暗主要相关的是下一排(通过下一排补齐)和初始状态,而每一排的初始状态是和其本身和上一排有关的,那么只要找出第一排所有的拉灯方案(2^5种)然后对这几种方案模拟一遍找能全亮且步数最小的方案. 锻炼搜索能力的好题 注意小于6步-交的时候没看见,日常

ZOJ 3814 Sawtooth Puzzle 状态压缩搜索

由于一个框框只有4种状态,总状态数只有4^9,bfs可解. 麻烦的地方就在于模拟. 我的状态的存法是,将初始状态看做000000000,若顺时针旋转一次就+1, 3+1=0. bfs的过程中,需要套一个dfs计算旋转当前框框会影响到哪些框. 有个地方要注意,就是目标状态其实不止一种,因为有些框框旋转之后不变,我们必须把所有可能的目标状态都计算出来,样例的中间那个框框就是这种情况. #include <iostream> #include<cstdio> #include<al