题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1556

预处理出两个障碍四个方向之间的距离(转弯次数),就可以状压DP了;

但预处理很麻烦...参考了TJ...:https://blog.csdn.net/senyelicone/article/details/56668048

用 spfa ,记录当前位置带一个朝向,然后转移时判断一下如果朝向不同就+1;

最后再从起点出发同样预处理一下,作为初始状态即可;

注意读入的地图上的 '#' 不仅是机关石,还有墙...所以不能忽略。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int const maxn=105,maxm=20,inf=0x3f3f3f3f;
int n,m,T,f[1<<16][maxm][5],dis[maxm][5][maxm][5],d[maxn][maxn][5];
int dx[5]={0,1,0,-1},dy[5]={1,0,-1,0},xx[maxm],yy[maxm],sx,sy,ans;
bool vis[maxn][maxn],roc[maxn][maxn];
queue<pair<int,int> >q;
bool ck(int x,int y){return x>0&&y>0&&x<=n&&y<=m;}
void spfa(int nw,int x,int y,int dr)
{if(roc[x][y]||!ck(x,y))return;while(q.size())q.pop();memset(d,0x3f,sizeof d);q.push(make_pair(x,y)); vis[x][y]=1;for(int k=0;k<4;k++)d[x][y][k]=0;while(q.size()){int nx=q.front().first,ny=q.front().second; q.pop(); vis[nx][ny]=0;for(int i=0;i<4;i++){int tx=nx+dx[i],ty=ny+dy[i];if(roc[tx][ty]||!ck(tx,ty))continue;//
            for(int j=0;j<4;j++)if(d[tx][ty][j]>d[nx][ny][i]+(i!=j)){d[tx][ty][j]=d[nx][ny][i]+(i!=j);if(!vis[tx][ty])vis[tx][ty]=1,q.push(make_pair(tx,ty));}}}for(int i=1;i<=T;i++)for(int j=0;j<4;j++)//从j撞击xi,yi
        {int tx=xx[i]+dx[j],ty=yy[i]+dy[j],tmp=inf;for(int k=0;k<4;k++)tmp=min(tmp,d[tx][ty][k]+(tx+dx[k]!=xx[i]||ty+dy[k]!=yy[i]));//反向dis[nw][dr][i][j]=tmp; }
}
int main()
{scanf("%d%d%d",&n,&m,&T);char ch[maxn];for(int i=1;i<=n;i++){cin>>ch;for(int j=0;j<m;j++)if(ch[j]=='#')roc[i][j+1]=1;}for(int i=1;i<=T;i++){scanf("%d%d",&xx[i],&yy[i]);
//        roc[x][y]=1;//'#'表示墙,不一定是机关石!!!
    }for(int i=1;i<=T;i++)for(int j=0;j<4;j++)spfa(i,xx[i]+dx[j],yy[i]+dy[j],j);scanf("%d%d",&sx,&sy);spfa(T+1,sx,sy,4);memset(f,0x3f,sizeof f); f[0][T+1][4]=0;int mx=(1<<T); ans=inf;for(int s=0;s<mx;s++)for(int i=1;i<=T+1;i++)for(int j=0;j<=4;j++)  if(f[s][i][j]!=inf)for(int k=1;k<=T;k++)for(int l=0;l<4;l++)f[s|(1<<(k-1))][k][l]=min(f[s|(1<<(k-1))][k][l],f[s][i][j]+dis[i][j][k][l]+1);for(int i=1;i<=T;i++)for(int j=0;j<4;j++)ans=min(ans,f[mx-1][i][j]);printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/Zinn/p/9399643.html

bzoj 1556 墓地秘密 —— 状压DP相关推荐

  1. BZOJ 1556 墓地秘密

    Description 费尽周折,终于将众将士的残骸运送到了KD军事基地地底层的大型墓地入口.KD的伙伴和战友们都参加了这次重大的送葬仪式.右边是一扇敞开的大门,进去便是墓地了,左边是一堵凹进去的墙, ...

  2. BZOJ 2073: [POI2004]PRZ( 状压dp )

    早上这道题没调完就去玩NOI网络同步赛了.... 状压dp , dp( s ) 表示 s 状态下所用的最短时间 , 转移就直接暴力枚举子集 . 可以先预处理出每个状态下的重量和时间的信息 . 复杂度是 ...

  3. BZOJ 4000: [TJOI2015]棋盘( 状压dp + 矩阵快速幂 )

    状压dp, 然后转移都是一样的, 矩阵乘法+快速幂就行啦. O(logN*2^(3m)) ------------------------------------------------------- ...

  4. BZOJ 2004 公交线路(状压DP+矩阵快速幂)

    注意到每个路线相邻车站的距离不超过K,也就是说我们可以对连续K个车站的状态进行状压. 然后状压DP一下,用矩阵快速幂加速运算即可. #include <stdio.h> #include ...

  5. bzoj 2073:[POI2004]PRZ 状压DP

    Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍在桥上的人都不能超过一定的限制. 所以这只队伍 ...

  6. BZOJ 2560: 串珠子 (状压DP+枚举子集补集+容斥)

    (Noip提高组及以下),有意者请联系Lydsy2012@163.com,仅限教师及家长用户. 2560: 串珠子 Time Limit: 10 Sec Memory Limit: 128 MB Su ...

  7. BZOJ 4042 Luogu P4757 [CERC2014]Parades (树形DP、状压DP)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4042 (Luogu) https://www.luogu.org/prob ...

  8. 【BZOJ】1076 [SCOI2008]奖励关 期望DP+状压DP

    [题意]n种宝物,k关游戏,每关游戏给出一种宝物,可捡可不捡.每种宝物有一个价值(有负数).每个宝物有前提宝物列表,必须在前面的关卡取得列表宝物才能捡起这个宝物,求期望收益.k<=100,n&l ...

  9. BZOJ 2734 [HNOI2012]集合选数 (状压DP、时间复杂度分析)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2734 题解 嗯早就想写的题,昨天因为某些不可告人的原因(大雾)把这题写了,今天再来写题解 ...

  10. BZOJ.3058.四叶草魔杖(Kruskal 状压DP)

    题目链接 \(2^{16}=65536\),可以想到状压DP.但是又有\(\sum A_i\neq 0\)的问题.. 但是\(2^n\)这么小,完全可以枚举所有子集找到\(\sum A_i=0\)的, ...

最新文章

  1. Java设计模式学习06——静态代理与动态代理(转)
  2. 文件服务器 之 ProFTPD+MySQL 认证
  3. 二十不惑,三十而已|网易互联网人的“焦虑必杀技”
  4. linux下c语言抓包库libpcap
  5. Java split拆分使用竖线为分隔符的字符串方法
  6. rpm升级时spec文件执行的流程
  7. python空类型用什么表示_python中怎么表示空值
  8. BundleFusion那些事儿
  9. 自己动手架设linux下Web服务器(图)5
  10. js设置radio选中
  11. (97)Verilog HDL:秒灯设计
  12. BlockingQueue - LinkedBlockingQueue常用API
  13. 虚拟系统管理VSM提高服务器整合率
  14. HTTP权威指南—基础部分
  15. 剖析Unreal Engine超真实人类的渲染技术Part 1 - 概述和皮肤渲染
  16. nginx做小程序外链跳转_微信小程序跳转到其他网页(外部链接)的实现方法
  17. HttpWebRequest 无法连接到远程服务器
  18. 苹果手机互传一键换机
  19. python读取pdf内容转word_【python】python实现PDF转word
  20. PHP递归的三种方式

热门文章

  1. python-excel读取代码1
  2. kettle中Pan kitchen用法及bat写法
  3. java i 原理_Java I/O模型及其底层原理
  4. python3 django 中文乱码_python3 wsgi服务和响应数据中文乱码问题
  5. JS键盘事件对象之keyCode、charCode、which属性对比
  6. mybatis-generator扩展教程系列 -- 自定义配置参数修改DAO,Mapper文件后缀
  7. Android课程---如何用网格视图做出手机桌面APP
  8. 架构之重构的12条军规(上)
  9. MongoDB学习之简介、下载、安装
  10. 阿里旺旺2012自动登录