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

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

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

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

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

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

代码如下:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<queue>
  6. using namespace std;
  7. int const maxn=,maxm=,inf=0x3f3f3f3f;
  8. int n,m,T,f[<<][maxm][],dis[maxm][][maxm][],d[maxn][maxn][];
  9. int dx[]={,,,-},dy[]={,,-,},xx[maxm],yy[maxm],sx,sy,ans;
  10. bool vis[maxn][maxn],roc[maxn][maxn];
  11. queue<pair<int,int> >q;
  12. bool ck(int x,int y){return x>&&y>&&x<=n&&y<=m;}
  13. void spfa(int nw,int x,int y,int dr)
  14. {
  15. if(roc[x][y]||!ck(x,y))return;
  16. while(q.size())q.pop();
  17. memset(d,0x3f,sizeof d);
  18. q.push(make_pair(x,y)); vis[x][y]=;
  19. for(int k=;k<;k++)d[x][y][k]=;
  20. while(q.size())
  21. {
  22. int nx=q.front().first,ny=q.front().second; q.pop(); vis[nx][ny]=;
  23. for(int i=;i<;i++)
  24. {
  25. int tx=nx+dx[i],ty=ny+dy[i];
  26. if(roc[tx][ty]||!ck(tx,ty))continue;//
  27. for(int j=;j<;j++)
  28. if(d[tx][ty][j]>d[nx][ny][i]+(i!=j))
  29. {
  30. d[tx][ty][j]=d[nx][ny][i]+(i!=j);
  31. if(!vis[tx][ty])vis[tx][ty]=,q.push(make_pair(tx,ty));
  32. }
  33. }
  34. }
  35. for(int i=;i<=T;i++)
  36. for(int j=;j<;j++)//从j撞击xi,yi
  37. {
  38. int tx=xx[i]+dx[j],ty=yy[i]+dy[j],tmp=inf;
  39. for(int k=;k<;k++)tmp=min(tmp,d[tx][ty][k]+(tx+dx[k]!=xx[i]||ty+dy[k]!=yy[i]));//反向
  40. dis[nw][dr][i][j]=tmp;
  41. }
  42. }
  43. int main()
  44. {
  45. scanf("%d%d%d",&n,&m,&T);
  46. char ch[maxn];
  47. for(int i=;i<=n;i++)
  48. {
  49. cin>>ch;
  50. for(int j=;j<m;j++)
  51. if(ch[j]=='#')roc[i][j+]=;
  52. }
  53. for(int i=;i<=T;i++)
  54. {
  55. scanf("%d%d",&xx[i],&yy[i]);
  56. // roc[x][y]=1;//'#'表示墙,不一定是机关石!!!
  57. }
  58. for(int i=;i<=T;i++)
  59. for(int j=;j<;j++)
  60. spfa(i,xx[i]+dx[j],yy[i]+dy[j],j);
  61. scanf("%d%d",&sx,&sy);
  62. spfa(T+,sx,sy,);
  63. memset(f,0x3f,sizeof f); f[][T+][]=;
  64. int mx=(<<T); ans=inf;
  65. for(int s=;s<mx;s++)
  66. for(int i=;i<=T+;i++)
  67. for(int j=;j<=;j++) if(f[s][i][j]!=inf)
  68. for(int k=;k<=T;k++)
  69. for(int l=;l<;l++)
  70. f[s|(<<(k-))][k][l]=min(f[s|(<<(k-))][k][l],f[s][i][j]+dis[i][j][k][l]+);
  71. for(int i=;i<=T;i++)
  72. for(int j=;j<;j++)
  73. ans=min(ans,f[mx-][i][j]);
  74. printf("%d\n",ans);
  75. return ;
  76. }

bzoj 1556 墓地秘密 —— 状压DP的更多相关文章

  1. BZOJ 1087 题解【状压DP】

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3112  Solved: 1816[Submit][ ...

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

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

  3. BZOJ 4057: [Cerc2012]Kingdoms( 状压dp )

    状压dp.... 我已开始用递归结果就 TLE 了... 不科学啊...我dp基本上都是用递归的..我只好改成递推 , 刷表法 将全部公司用二进制表示 , 压成一个数 . 0 表示破产 , 1 表示没 ...

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

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

  5. bzoj 2669 题解(状压dp+搜索+容斥原理)

    这题太难了...看了30篇题解才整明白到底咋回事... 核心思想:状压dp+搜索+容斥 首先我们分析一下,对于一个4*7的棋盘,低点的个数至多只有8个(可以数一数) 这样的话,我们可以进行一个状压,把 ...

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

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

  7. BZOJ 1226 学校食堂(状压DP)

    状压DP f(i,j,k)表示前i−1个人已经吃了饭,且在i之后的状态为j的人也吃了饭(用二进制表示后面的状态),最后吃的那个人是i之后的第k个 (注意k可以是负数) 然后 如果j&1=1那么 ...

  8. bzoj 2734 集合悬殊 (状压dp)

    大意: 给定$n$, 求集合{1,2,...n}的子集数, 满足若$x$在子集内, 则$2x,3x$不在子集内. 记$f(x)$为$x$除去所有因子2,3后的数, 那么对于所有$f$值相同的数可以划分 ...

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

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

随机推荐

  1. 在VirtualBox上安装Solaris 10全教程(包括下载)

    您可以在博文的最下方留下评价, 也可以点击左边的 关注 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐 来支持一下喔 如果您对博文有任何疑问, 可以通过评论或发邮件的 ...

  2. Zabbix 客户端安装教程(第二篇)

    Zabbix 客户端安装教程 blog地址:http://www.cnblogs.com/caoguo [root@localhost ~]# yum install -y gcc make [roo ...

  3. C# 获得固定年月日

    /// <summary> /// 获得固定年月日,时和分不固定 : 2019-01-01 00:00:00 /// </summary> /// <returns> ...

  4. PAT-day1

    1001 害死人不偿命的(3n+1)猜想 (15 分)   卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 ( 3n+1)砍掉一半.这样一直 ...

  5. git clone下载代码,中途断掉怎么办?

    问题如下: 解决办法: 1)运行以下命令进行clone $ git clone --recursive https:xxxxxx 2)进入项目根目录,继续下载 $ cd eigen-git-mirro ...

  6. Django - 视图获取请求头

    1.urls.py(url和函数对应关系) 2.通过request.evniron,返回request的所有信息,用索引的方式,获取用户请求头信息. 3.也可以通过key,value方式,来展示请求头 ...

  7. inet_XX族函数

    在网络编程中, 经常会将网络字节转为本地字节或者将本地字节转为网络字节, 但是如果每次我们都是都通过htonl, ntohl函数需要将10进制转为整数, 甚至还用将字符串转为整数, 再转为网络字节, ...

  8. codevs1231 最优布线问题

    1231 最优布线问题 题目描述 Description 学校需要将n台计算机连接起来,不同的2台计算机之间的连接费用可能是不同的.为了节省费用,我们考虑采用间接数据传输结束,就是一台计算机可以间接地 ...

  9. proxy 跨域配置, 针对有axios的baseURL

    1.首先主要的config文件下的index.js中的proxytable配置 proxyTable:{ '/proxy': { target:'http://192.168.2.141:8080', ...

  10. Python-基本语法元素

    #TempConvert.py TempStr = input("请输入带有符号的温度值: ") if TempStr[-1] in ['F', 'f']: C = (eval(T ...