2333333333333333333333333333333333333333333333

啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

辣鸡出题人辣鸡出题人辣鸡出题人辣鸡出题人辣鸡出题人辣鸡出题人

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define inf 1000000007
using namespace std;
int n,m,t,wh[][],dis[][],x[],y[],tab[][][][],pre[][],fro[][][][],f[(<<)+][][];
int dx[]={,-,,,},dy[]={,,,,-};
bool map[][],vis[][];
char s[];
queue <int> q;
void reset()
{
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
dis[i][j]=inf;
while (!q.empty()) q.pop();
memset(vis,false,sizeof(vis));
}
bool judge(int x,int y)
{
if ((x>=) && (x<=n) && (y>=) && (y<=m) && (!map[x][y]))
return true;
return false;
}
void spfa(int pos,int dir)
{
memset(pre,,sizeof(pre));
if (!judge(x[pos]+dx[dir],y[pos]+dy[dir])) return;
dis[x[pos]+dx[dir]][y[pos]+dy[dir]]=;vis[x[pos]+dx[dir]][y[pos]+dy[dir]]=true;
q.push(x[pos]+dx[dir]);q.push(y[pos]+dy[dir]);
while (!q.empty())
{
int hx,hy;
hx=q.front();q.pop();hy=q.front();q.pop();
int p=;
while (judge(hx-p,hy))
{
if ((dis[hx-p][hy]>dis[hx][hy]+) || ((dis[hx-p][hy]==dis[hx][hy]+) && (wh[hx-p][hy]==)))
{
dis[hx-p][hy]=dis[hx][hy]+;
pre[hx-p][hy]=;
if (!vis[hx-p][hy])
{
vis[hx-p][hy]=true;
q.push(hx-p);q.push(hy);
}
}
p++;
}
p=;
while (judge(hx+p,hy))
{
if ((dis[hx+p][hy]>dis[hx][hy]+) || ((dis[hx+p][hy]==dis[hx][hy]+) && (wh[hx+p][hy]==)))
{
dis[hx+p][hy]=dis[hx][hy]+;
pre[hx+p][hy]=;
if (!vis[hx+p][hy])
{
vis[hx+p][hy]=true;
q.push(hx+p);q.push(hy);
}
}
p++;
}
p=;
while (judge(hx,hy-p))
{
if ((dis[hx][hy-p]>dis[hx][hy]+) || ((dis[hx][hy-p]==dis[hx][hy]+) && (wh[hx][hy-p]==)))
{
dis[hx][hy-p]=dis[hx][hy]+;
pre[hx][hy-p]=;
if (!vis[hx][hy-p])
{
vis[hx][hy-p]=true;
q.push(hx);q.push(hy-p);
}
}
p++;
}
p=;
while (judge(hx,hy+p))
{
if ((dis[hx][hy+p]>dis[hx][hy]+) || ((dis[hx][hy+p]==dis[hx][hy]+) && (wh[hx][hy+p]==)))
{
dis[hx][hy+p]=dis[hx][hy]+;
pre[hx][hy+p]=;
if (!vis[hx][hy+p])
{
vis[hx][hy+p]=true;
q.push(hx);q.push(hy+p);
}
}
p++;
}
vis[hx][hy]=false;
}
}
void get_tab(int pos,int dir)
{
for (int i=;i<=t+;i++)
for (int j=;j<=;j++)
{
if (judge(x[i]+dx[j],y[i]+dy[j]))
{
tab[pos][dir][i][j]=dis[x[i]+dx[j]][y[i]+dy[j]];
fro[pos][dir][i][j]=pre[x[i]+dx[j]][y[i]+dy[j]];
}
}
}
int main()
{
//freopen("secret.in","r",stdin);
//freopen("secret.out","w",stdout);
memset(map,false,sizeof(map));
scanf("%d%d%d",&n,&m,&t);
for (int i=;i<=n;i++)
{
scanf("\n%s",s);
for (int j=;j<m;j++)
if (s[j]=='#') map[i][j+]=true;
}
for (int i=;i<=t;i++)
{
scanf("%d%d",&x[i],&y[i]);
map[x[i]][y[i]]=true;
}
for (int i=;i<=t;i++)
{
for (int j=;j<=;j++)
{
if (judge(x[i]+dx[j],y[i]+dy[j]))
wh[x[i]+dx[j]][y[i]+dy[j]]=j;
}
}
scanf("%d%d",&x[t+],&y[t+]);
for (int i=;i<=t+;i++)
for (int j=;j<=;j++)
for (int k=;k<=t;k++)
for (int l=;l<=;l++)
tab[i][j][k][l]=inf;
for (int i=;i<=t;i++)
{
for (int j=;j<=;j++)
{
reset();
spfa(i,j);
get_tab(i,j);
}
}
reset();
spfa(t+,);
for (int i=;i<=t+;i++)
for (int j=;j<=;j++)
{
if (judge(x[i]+dx[j],y[i]+dy[j]))
{
tab[t+][][i][j]=dis[x[i]+dx[j]][y[i]+dy[j]];
fro[t+][][i][j]=pre[x[i]+dx[j]][y[i]+dy[j]];
}
}
int top=(<<t)-;
for (int s=;s<=top;s++)
for (int i=;i<=t;i++)
for (int j=;j<=;j++)
f[s][i][j]=inf;
for (int i=;i<=t;i++)
for (int j=;j<=;j++)
{
if (fro[t+][][i][j]!=j)
f[<<(i-)][i][j]=tab[t+][][i][j]+;
else f[<<(i-)][i][j]=tab[t+][][i][j];
}
for (int ss=;ss<=top;ss++)
{
for (int i=;i<=t;i++)
{
if (ss&(<<(i-)))
{
for (int j=;j<=t;j++)
{
if (ss&(<<(j-))) continue;
for (int k=;k<=;k++)
for (int l=;l<=;l++)
{
if (tab[i][k][j][l]==inf) continue;
if (fro[i][k][j][l]!=l)
f[ss|<<(j-)][j][l]=min(f[ss|<<(j-)][j][l],f[ss][i][k]+tab[i][k][j][l]+);
else f[ss|<<(j-)][j][l]=min(f[ss|<<(j-)][j][l],f[ss][i][k]+tab[i][k][j][l]);
}
}
}
}
}
int ans=inf;
for (int i=;i<=t;i++)
for (int j=;j<=;j++)
ans=min(ans,f[top][i][j]);
printf("%d\n",ans);
return ;
}

BZOJ 1556 墓地秘密的更多相关文章

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

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

  2. bzoj 1556: 墓地秘密【状压dp+spfa】

    显然是状压,显然不可能把所有格子压起来 仔细观察发现只有机关周围的四个格子有用以及起点,所以我们用spfa处理出这些格子两两之间的距离(注意细节--这里写挂了好几次),然后设f[s][i]为碰完的机关 ...

  3. BZOJ1556 墓地秘密

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

  4. 洛谷 2922 BZOJ 1590 [USACO08DEC]秘密消息Secret Message

    [题意概述] 给出n个01串组成的字典和m个询问,每次询问某个01串和多少个字典中的串有相同的前缀.(前缀长度是两串中较小的部分) [题解] 直接上Trie树即可.树上每个节点记录两个信息:这个节点有 ...

  5. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  6. BZOJ 刷题总结(持续更新)

    本篇博客按照题号排序(带*为推荐题目) 1008 [HNOI2008]越狱 很经典的题了..龟速乘,龟速幂裸题,, 1010 [HNOI2008]玩具装箱toy* 斜率优化 基本算是裸题. 1012 ...

  7. bzoj1556 (DP)

    bzoj 1556 点这里打开题目 题目是求 a^2 求和: 原问题可以转化为:两个人在玩这个东西,问这两个人弄出来的序列相同的有多少种情况,操作方式不同即为一种不同的情况. 就这个问题,参考大佬的D ...

  8. bzoj 1590: [Usaco2008 Dec]Secret Message 秘密信息

    1590: [Usaco2008 Dec]Secret Message 秘密信息 Description     贝茜正在领导奶牛们逃跑.为了联络,奶牛们互相发送秘密信息.     信息是二进制的,共 ...

  9. 【BZOJ】1643: [Usaco2007 Oct]Bessie's Secret Pasture 贝茜的秘密草坪(dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1643 这题和完全背包十分相似, 但是不能用1维做........原因貌似是不能确定块数(还是有0的面 ...

随机推荐

  1. POJ2451 Uyuw's Concert(半平面交)

    题意就是给你很多个半平面,求半平面交出来的凸包的面积. 半平面交有O(n^2)的算法,就是每次用一个新的半平面去切已有的凸包,更新,这个写起来感觉也不是特别好写. 另外一个O(nlogn)的算法是将半 ...

  2. 制作Ubuntu Live USB的方法

    首先准备一个U盘 然后下载unetbootin 项目主页http://unetbootin.net/ 下载最新版本的unetbootin 打开后界面如下: 如果你已经下载好了ubuntu-12.04- ...

  3. mvc5 _ViewStart.cshtml 模板页如何定义

    1._Viewstart.cshtml是一个在呈现View文件的时候的启动文件,会在所有View(.cshtml)被执行之前执行,主要用于一些不方便或不能在母版(_Layout.cshtml)中进行的 ...

  4. 8天学通MongoDB——第三天 细说高级操作

    原文地址:http://www.cnblogs.com/huangxincheng/archive/2012/02/21/2361205.html 今天跟大家分享一下mongodb中比较好玩的知识,主 ...

  5. 关于HTTP协议的学习

    HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP 协议的详细内容请参考RFC2616.HTTP协议采用了请求/响应模型.客 ...

  6. Zabbix简介(第一章第一节)

    Alexei Vladishev创建了Zabbix项目,当前处于活跃开发状态,Zabbix SIA提供支持. Zabbix是一个企业级的.开源的.分布式的监控套件 Zabbix可以监控网络和服务的监控 ...

  7. Spring之在客户端访问RESTful业务

    Spring之在客户端访问RESTful业务 RestTemplate 是客户端访问RESTful业务的核心类.在概念上与Spring其他的模板类相似,比如JdbcTemplate和JmsTempla ...

  8. C++:构造函数的默认参数知识拓展

    和普通函数一样,构造函数中参数的值既可以通过实参传递,也可以指定为某些默认值,即如果用户不指定实参值,编译系统就使形参取默认值.   例9.3的问题也可以使用包含默认参数的构造函数来处理.   [例9 ...

  9. swift:创建九宫格

    九宫格的创建是有规律可循的,每一个格子的水平和竖直方向的间隔是固定的,通过计算每一个格子的位置,然后把它们依次放到视图中即可. 一般的步骤为: 1.设置格子的总个数和每一列的格子数 2.求格子的间隔: ...

  10. 借助adb与gdb确认app内存缓存中是否存在用户敏感数据

    一.环境准备 1. 搭建adb调试桥 可参考文章<ADB调试桥安装(方式二)> 2. 安装调试gdb工具 可参考文章<移动设备中导入gdb调试工具> 二.测试执行 root@G ...