来自xjy的签到题

Description

爱丽丝冒险来到了红皇后一个n*n大小的花园,每个格子由'.'或'#'表示,'.'表示爱丽丝可以到达这个格子,‘#’表示爱丽丝不能到达这个格子,爱丽丝每1分钟可以移动到非'#'的相邻格子(与当前所在格子具有公共边)。花园下面有m个隧道,每个隧道有一个出口和一个入口。当爱丽丝到达隧道的入口时,她可以选择(也可以不选择)进入隧道入口,并通过隧道一次,然后立即(不花费时间)出现在隧道出口。爱丽丝一开始可以降临在花园的任何地方。有好奇心的爱丽丝想知道,她通过所有隧道且每个隧道仅通过一次最少需要花费多少时间。(注意,爱丽丝不能从隧道出口通往隧道入口)

Input

输入包含多个测试用例,不超过10组。对于每个测试用例,第一行输入n(1<=n<=15)和m(1<=m<=15),分别表示地图的大小为n*n和m个隧道。然后给出一个n行n列的花园地图,由'.'或'#'组成,'.'表示爱丽丝可以到达这个格子,‘#’表示爱丽丝不能到达这个格子。接下来m行,表示m个隧道。每行四个正整数x1,y1,x2,y2(1<=x1,x2,y1,y2<=15),表示隧道的入口为(x1,y1),出口为(x2,y2)。数据保证隧道入口和出口位置不会出现在‘#’上。

Output

对于每个测试用例,你需要输出一个整数,表示爱丽丝通过所有隧道仅一次的最少时间。如果爱丽丝无法通过所有隧道,则输出-1。

Sample Input 1

5 4
....#
...#.
.....
.....
.....
2 3 1 4
1 2 3 5
2 3 3 1
5 4 2 1

Sample Output 1

7

Hint

对于样例,爱丽丝可以一开始降临在(2,3)并穿过第一个隧道到达(1,4),然后花费2分钟走向(1,2)并穿过第二个隧道到达(3,5),然后花费3分钟走向(5,4)并穿过第四个隧道到达(2,1),最后花费2分钟走向(2,3)并穿过第三个隧道到达(3,1)。至此通过所有隧道,并花费7分钟时间。

注意本题时间限制和空间限制

将隧道视为点,先bfs预处理出两两隧道间的距离,然后使用状压dp求出最小时间。

转移方程:dp[目标状态][目标点]=min(dp[目标状态][目标点],dp[当前状态][当前点]+dis[当前点][目标点])。

#include<bits/stdc++.h>
#define MAX 16
#define INF 0x3f3f3f3f
using namespace std;char s[MAX][MAX];
int b[MAX][MAX],dis[MAX][MAX];
int dp[1<<15][MAX];
int t[4][2]={1,0,0,1,-1,0,0,-1};
struct Node{int bx,by,ex,ey;
}a[MAX];
struct Node2{int x,y,s;
}node;
queue<Node2> q;int bfs(Node u,Node v,int n){memset(b,0,sizeof(b));while(q.size()){q.pop();}if(u.ex==v.bx&&u.ey==v.by) return 0;node.x=u.ex;node.y=u.ey;node.s=0;q.push(node);b[node.x][node.y]=1;while(q.size()){for(int i=0;i<4;i++){Node2 now=q.front();int tx=now.x+t[i][0];int ty=now.y+t[i][1];if(tx<1||tx>n||ty<1||ty>n) continue;if(s[tx][ty]=='#'||b[tx][ty]==1) continue;b[tx][ty]=1;if(tx==v.bx&&ty==v.by){return now.s+1;}node.x=tx;node.y=ty;node.s=now.s+1;q.push(node);}q.pop();}return INF;
}
int main()
{int n,m,i,j,k;while(~scanf("%d%d",&n,&m)){for(i=1;i<=n;i++){scanf(" %s",s[i]+1);}for(i=1;i<=m;i++){scanf("%d%d%d%d",&a[i].bx,&a[i].by,&a[i].ex,&a[i].ey);}memset(dis,INF,sizeof(dis));for(i=1;i<=m;i++){for(j=1;j<=m;j++){if(i==j) continue;dis[i][j]=bfs(a[i],a[j],n);}}memset(dp,INF,sizeof(dp));for(i=1;i<=m;i++){dp[1<<(i-1)][i]=0;}for(i=0;i<(1<<m);i++){for(j=1;j<=m;j++){if(!(i&(1<<(j-1)))) continue;for(k=1;k<=m;k++){if(j==k||dis[j][k]==INF||!(i&(1<<(k-1)))) continue;dp[i][k]=min(dp[i][k],dp[i^(1<<(k-1))][j]+dis[j][k]);}}}int ans=INF;for(i=1;i<=m;i++){ans=min(ans,dp[(1<<m)-1][i]);}if(ans==INF) printf("-1\n");else printf("%d\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/yzm10/p/9568363.html

QDUOJ 来自xjy的签到题(bfs+状压dp)相关推荐

  1. Orz_panda cup I题 (xdoj1117) 状压dp

    Orz_panda cup I题 (xdoj1117)  状压dp 1117: Insert Orz Pandas 时间限制: 2 Sec  内存限制: 128 MB 提交: 15  解决: 5 [提 ...

  2. Tunnels HDU - 4856 (bfs状压dp)

    Tunnels HDU - 4856 Bob is travelling in Xi'an. He finds many secret tunnels beneath the city. In his ...

  3. HDU-4856 Tunnels(BFS状压DP)

    Tunnels http://acm.hdu.edu.cn/showproblem.php?pid=4856 Time Limit: 3000/1500 MS (Java/Others)    Mem ...

  4. hdu 4568 bfs + 状压dp

    //这题的数据是不是有问题... 不考虑宝藏一个也拿不到也能AC... 1 #include "bits/stdc++.h" 2 using namespace std; 3 co ...

  5. HDU 4856 Tunnels(BFS+状压DP)

    HDU 4856 Tunnels 题目链接 题意:给定一些管道.然后管道之间走是不用时间的,陆地上有障碍.陆地上走一步花费时间1,求遍历全部管道须要的最短时间.每一个管道仅仅能走一次 思路:先BFS预 ...

  6. HDU4856:Tunnels (BFS 状压dp)

    Bob is travelling in Xi'an. He finds many secret tunnels beneath the city. In his eyes, the city is ...

  7. HDU-4856 Tunnels(BFS+状压DP)

    题意 N×NN×NN \times N 的地图,某些点上存在障碍.有 MMM 个隧道.每个隧道都有它的起点和终点(穿隧道可以看成瞬移),求穿过所有的隧道需要的最短时间,起始点任选. 1≤N,M≤15& ...

  8. [2021-09-09 T3] 序列/luogu P3943 星空(异或差分+bfs最短路+状压dp)

    序列 description solution code description 题目描述 长度为nnn的序列,初始全为000,每次可以选择⼀个数ai(1≤i≤l)a_i(1\le i\le l)ai ...

  9. bfs+状压——朋也与光玉

    朋也与光玉 本来说好了再做一下之前没写起的题的,但是看到队友写了这道题手还是比较痒,于是就写了. ------------------------------------------ 题解: 这道题和 ...

最新文章

  1. JavaScript---认识JavaScipt
  2. androidx86安装pc后无法联网_问题解决记录-npm和yarn全局安装成功后命令无法执行的问题...
  3. 山东省2O2021年普通高考成绩查询,2021山东高考报名人数公布
  4. mysql锁与性能_MySQL性能优化--锁(概念)
  5. UML图入门学习笔记
  6. java filter加时间戳_java filter加时间戳
  7. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(5) - 算术指令
  8. Django-04-路由系统
  9. ORA-01427: 单行子查询返回多个行 出现原因及对应防止措施
  10. c语言小游戏代码大全300行,C语言贪吃蛇经典小游戏
  11. linux运维故障案列,linux 运维故障排查思路
  12. 如何实现高性能的在线 PDF 预览
  13. Android 在后台无法启动Activity
  14. 【读书】兔兔西的已读书单
  15. 推荐计算机 在线使用方法,在线记笔记平台推荐:如何优雅地用电脑记笔记
  16. iOS开发:关于UILabel、UIButton、UITextField文字下划线的设置方法(涉及到富文本的知识)
  17. C语音:for循环实现n个数简单求和
  18. 基于STM32的ESP8266使用教程(二)
  19. 《数据仓库与数据挖掘教程》ch01绪论 章节整理
  20. Postgres安装及MIMIC IV数据库的载入(Windows 10)

热门文章

  1. 前端大牛贺师俊与 360 劳动纠纷引前端圈巨震,技术人维权有多难?
  2. scpi指令转换c语言,SCPI 标准命令
  3. ElasticSearch个人学习笔记 狂神说
  4. python实现ks算法_如何在Python中实现KSTest
  5. Vue.js 组件复用和扩展之道
  6. 积跬步以至千里,积怠惰以致深渊
  7. 号称“永不限速”的阿里云网盘开始公测预约!或将支持度盘一键迁移
  8. 计算机的GPU和CPU,gpu和cpu的区别
  9. 迅猛发展 下一代数据库趋势解析
  10. BAT大厂高手是如何优雅装逼的?一个价值10万的思维工具:费米估算