http://acm.hdu.edu.cn/showproblem.php?pid=4856

这道题就是搜索BFS+状压dp,把所经过的隧道的状态用二进制表示,然后dp就行。bfs求出每两个隧道的最短距离。

 #include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
#define maxn 1000
using namespace std;
const int inf=<<; int n,m;
char g[][];
int gg[][];
struct node
{
int x1,y1,x2,y2;
} p[maxn],st3;
int dis[][];
int dir[][]= {{,},{,-},{,},{-,}};
int dp[<<][];
bool vis[maxn][maxn]; int bfs(int s,int t)
{
queue<node>q;
memset(vis,false,sizeof(vis));
for(int i=; i<n; i++)
{
for(int j=; j<n; j++)
{
dis[i][j]=inf;
}
}
node st;
st.x1=p[s].x2;
st.y1=p[s].y2;
dis[p[s].x2][p[s].y2]=;
vis[p[s].x2][p[s].y2]=true;
q.push(st);
while(!q.empty())
{
node st1=q.front();
q.pop();
if(st1.x1==p[t].x1&&st1.y1==p[t].y1)
{
return dis[p[t].x1][p[t].y1];
}
for(int i=; i<; i++)
{
int xx=st1.x1+dir[i][];
int yy=st1.y1+dir[i][];
if(xx>=&&xx<n&&yy>=&&yy<n&&g[xx][yy]!='#')
{
if(!vis[xx][yy])
{
dis[xx][yy]=dis[st1.x1][st1.y1]+;
st3.x1=xx;
st3.y1=yy;
vis[xx][yy]=true;
q.push(st3);
}
}
}
}
return -;
} int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(g,,sizeof(g));
for(int i=; i<n; i++)
{
scanf("%s",g[i]);
}
for(int i=; i<m; i++)
{
scanf("%d%d%d%d",&p[i].x1,&p[i].y1,&p[i].x2,&p[i].y2);
p[i].x1-=;
p[i].y1-=;
p[i].x2-=;
p[i].y2-=;
}
memset(dp,-,sizeof(dp));
for(int i=; i<m; i++)
{
for(int j=; j<m; j++)
{
if(i==j) gg[i][j]=;
else
gg[i][j]=bfs(i,j);
}
}
for(int i=; i<m; i++)
{
dp[<<i][i]=;
}
for(int i=; i<(<<m); i++)
{
for(int j=; j<m; j++)
{
if((i&(<<j))==) continue;
if(dp[i][j]==-) continue;
for(int k=; k<m; k++)
{
if(gg[j][k]==-) continue;
if(i&(<<k)) continue;
if(dp[i|(<<k)][k]==-) dp[i|(<<k)][k]=dp[i][j]+gg[j][k];
else dp[i|(<<k)][k]=min(dp[i|(<<k)][k],dp[i][j]+gg[j][k]);
}
}
}
int ans=inf;
for(int i=; i<m; i++)
{
if(dp[(<<m)-][i]!=-)
ans=min(ans,dp[(<<m)-][i]);
}
if(ans==inf) printf("-1\n");
else
printf("%d\n",ans);
}
return ;
}

最新文章

  1. ssh(sturts2_spring_hibernate) 框架搭建之JPA代替hibernate
  2. 使用JPA储存Text类型的时候 出现乱码的问题
  3. sort将文件的每一行作为一个单位按ASCII码值进行比较
  4. 整合spring,springmvc和mybatis
  5. USACO section1.2 Miking cows
  6. 《1024伐木累》-te别篇,庭审你知道吗?
  7. exit(0)与exit(1)、return区别
  8. hdu 4675 GCD of Sequence
  9. 解决Windows+Eclipse+Python错误: SyntaxError: Non-ASCII character
  10. Navicat premium 破解步骤
  11. Apache 2.4.27 局域网访问提示 You don&#39;t have permission to access / on this server
  12. 洛谷P1209修理牛棚题解
  13. nginx安装目录详解(针对centos)
  14. ps高级磨皮的7个步骤
  15. 修改控制台为Consolas字体
  16. 初识restful api接口
  17. 【编程之外】从《海贼王》的视角走进BAT的世界
  18. Charm Bracelet(01背包问题)
  19. input点击链接另一个页面,各种操作。
  20. 最NB的发现 LINUX 下玩teamviewer 命令行设置密码

热门文章

  1. 机器学习实战__安装python环境
  2. 用MFC完成一个简单的猜数字游戏: 输入的四位数中,位置和数字都正确为A,数字相同而位置不同的为B。
  3. HDU 2853 Assignment(KM最大匹配好题)
  4. HTML编辑器UEditor的简单使用
  5. txt文件导入mysql--转
  6. 通过模拟器和ida搭建Android动态调试环境的问题
  7. 配置Ssh免密码登录
  8. Android开发手记(10) 下拉菜单Spinner
  9. jquery的几种异步请求,ajax
  10. 对于没有Command属性时,怎么来达到相同的效果