显然是状压,显然不可能把所有格子压起来

仔细观察发现只有机关周围的四个格子有用以及起点,所以我们用spfa处理出这些格子两两之间的距离(注意细节……这里写挂了好几次),然后设f[s][i]为碰完的机关石状态为s,现在在有用格子的第i个的最小停下次数,转移按照套路即可

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int N=105,dx[]={0,0,1,-1},dy[]={1,-1,0,0};
int n,m,t,a[N][N],f[70005][65],x[N],y[N],bx,by,dis[N][N][5],id[N][5],tot;
char c[N][N];
bool v[N][N];
struct qwe
{
int x,y;
qwe(int X=0,int Y=0)
{
x=X,y=Y;
}
};
bool ok(int x,int y)
{
return x>=1&&x<=n&&y>=1&&y<=m&&c[x][y]!='#';
}
void spfa(int sx,int sy,int s)
{//cerr<<sx<<" "<<sy<<endl;
if(!ok(sx,sy))
return;
// cerr<<s<<endl;
queue<qwe>q;
memset(dis,0x3f,sizeof(dis));
dis[sx][sy][0]=dis[sx][sy][1]=dis[sx][sy][2]=dis[sx][sy][3]=0;
v[sx][sy]=1;
q.push(qwe(sx,sy));
while(!q.empty())
{
int x=q.front().x,y=q.front().y;
q.pop();
v[x][y]=0;
for(int j=0;j<4;j++)
if(ok(x+dx[j],y+dy[j]))
for(int k=0;k<4;k++)
if(dis[x+dx[j]][y+dy[j]][k]>dis[x][y][j]+(j!=k))
{
dis[x+dx[j]][y+dy[j]][k]=dis[x][y][j]+(j!=k);
if(!v[x+dx[j]][y+dy[j]])
{
v[x+dx[j]][y+dy[j]]=1;
q.push(qwe(x+dx[j],y+dy[j]));
}
}
}
for(int i=1;i<=t;i++)
for(int j=0;j<4;j++)
for(int k=0;k<4;k++)
a[s][id[i][j]]=min(a[s][id[i][j]],dis[x[i]+dx[j]][y[i]+dy[j]][k]+(dx[j]+dx[k]!=0||dy[j]+dy[k]!=0));
}
int main()
{
scanf("%d%d%d",&n,&m,&t);
for(int i=1;i<=n;i++)
scanf("%s",c[i]+1);
for(int i=1;i<=t;i++)
scanf("%d%d",&x[i],&y[i]);
scanf("%d%d",&bx,&by);
for(int i=1;i<=t;i++)
for(int j=0;j<4;j++)
id[i][j]=++tot;
memset(a,0x3f,sizeof(a));
for(int i=1;i<=t;i++)
for(int j=0;j<4;j++)
spfa(x[i]+dx[j],y[i]+dy[j],id[i][j]);//,cerr<<x[i]<<" "<<dx[j]<<" "<<y[i]<<" "<<dy[j]<<endl;
spfa(bx,by,tot+1);
// for(int i=1;i<=tot+1;i++)
// {
// for(int j=1;j<=tot+1;j++)
// cerr<<a[i][j]<<" ";
// cerr<<endl;
// }
memset(f,0x3f,sizeof(f));
f[0][tot+1]=0;
for(int i=0,len=(1<<t)-1;i<=len;i++)
for(int j=1;j<=tot+1;j++)
for(int k=1;k<=tot;k++)
f[i|(1<<((k-1)/4))][k]=min(f[i|(1<<((k-1)/4))][k],f[i][j]+a[j][k]+1);
int ans=1e9;
for(int i=1;i<=tot;i++)
ans=min(ans,f[(1<<t)-1][i]);
printf("%d\n",ans);
return 0;
}

bzoj 1556: 墓地秘密【状压dp+spfa】的更多相关文章

  1. bzoj 1556 墓地秘密 —— 状压DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1556 预处理出两个障碍四个方向之间的距离(转弯次数),就可以状压DP了: 但预处理很麻烦.. ...

  2. 洛谷P2761 软件补丁问题(状压DP,SPFA)

    题意 描述不清... Sol 网络流24题里面怎么会有状压dp?? 真是狗血,不过还是简单吧. 直接用$f[sta]$表示当前状态为$sta$时的最小花费 转移的时候枚举一下哪一个补丁可以搞这个状态 ...

  3. BZOJ 1087 题解【状压DP】

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

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

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

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

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

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

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

  7. HDU 4284 状压dp+spfa

    题意: 给定n个点 m条无向边 d元. 以下m行表示每条边 u<=>v 以及花费 w 以下top 以下top行 num c d 表示点标为num的城市 工资为c 健康证价格为d 目标是经过 ...

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

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

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

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

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

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

随机推荐

  1. jquery的ajax提交时“加载中”提示的处理方法

    方法1:使用ajaxStart方法定义一个全局的“加载中...”提示 $(function(){    $("#loading").ajaxStart(function(){    ...

  2. 线程&线程池

    线程 进程和线程: 进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),而线程才是cpu上的执行单位. 注意:两个都是过程 线程一个特点: 一个进程中,多个线程共享资源 线程和进程区 ...

  3. python学习之-- mysql模块和sqlalchemy模块

    简单介绍python下操作mysql数据库模块有2个:pyhton-mysqldb  和 pymysql 说明:在python3中支持mysql 的模块已经使用pymysql替代了MysqlDB(这个 ...

  4. [洛谷U22157]刷水题(数位dp)(hash)

    题目背景 做正经题是不可能做正经题的,这辈子都不可能做正经题的,毒瘤题又不会做毒瘤题,就是水题这种东西,才维持了蒟蒻的信心: 题目描述 这里有N+1 道水题,编号分别为0 ~N+1 ,每道水题都有它自 ...

  5. java数据结构和算法09(哈希表)

    树的结构说得差不多了,现在我们来说说一种数据结构叫做哈希表(hash table),哈希表有是干什么用的呢?我们知道树的操作的时间复杂度通常为O(logN),那有没有更快的数据结构?当然有,那就是哈希 ...

  6. Java日志框架-logback配置文件参考(转)

    logback.xml <!-- if debug set to true, context info always print otherwise the contex info will p ...

  7. eclipse默认指定项目的编译器版本

    eclipse 提示 @Override must override a superclass method 问题解决 今天新换了一个Eclipse 版本: Build id: 20140224-06 ...

  8. Meteor集合

    在本教程中,我们将学习如何使用 MongoDB集合. 创建集合 我们可以使用以下代码来创建一个新的集合- meteorApp/client/main.js MyCollection = new Mon ...

  9. linux 解压zip文件

    linux 解压zip文件 学习了:https://blog.csdn.net/hbcui1984/article/details/1583796 unzip xx.zip

  10. iOS开发-UITableView单选多选/复选实现1

    TableView怎样实现单选或者多选呢? 我们的直接思路是改动某一个Cell的样式就可以, 那么改动样式须要通过改动相应的数据, 从这里能够判断我们须要给Cell相应的数据设置一个标志位, 当选中的 ...