题目传送门

因为太蒟了,所以参考了dalao@zbtrs ==    对此表示感谢并侵删。

看起来我们就知道这是搜索题。

最后的情况分两种:有骑士背国王/国王自食其力走到集合点。

首先,我们不知道大家最后集合在哪里,所以可以枚举一下这个点。

其次,我们不知道是哪个骑士背,所以再枚举一下。

再次,我们不知道在哪里接国王,所以再枚举一下这个点。

这是思路的大体框架。然后在更新答案时,我们需要求出在棋盘上一个点到另一点的最短距离。然后因为我们可以等效的认为这是一个无向无环图,所以直接用bfs顺便跑出最短距离就行了==。

细节:赋初值。dis数组和ans都要赋成正无穷。因为我们在寻求一个最小值。

优化:最优性剪枝(代码中)

Code

 /*
ID:cellur_2
TASK:camelot
LANG:C++
*/
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring> using namespace std;
const int inf=0x3f3f3f; int n,m,cnt,ans=inf;
char ch[];
bool vis[][];
int dx[]={,-,-,,,,,-,-};
int dy[]={,,,,,-,-,-,-};
int dis[][][][];
int kingx,kingy;
struct point{
int x,y;
}knight[]; bool valid(int x,int y)
{
if(x>=&&x<=n&&y>=&y<=m) return ;
return ;
} void bfs(int x,int y)
{
queue<pair<int,int> >q;
q.push(make_pair(x,y));
memset(vis,,sizeof(vis));
vis[x][y]=;
dis[x][y][x][y]=;
while(!q.empty())
{
int xx=q.front().first;
int yy=q.front().second;
q.pop();
int step=dis[x][y][xx][yy];
for(int i=;i<=;i++)
{
int rx=xx+dx[i];
int ry=yy+dy[i];
if(valid(rx,ry)&&!vis[rx][ry])
{
dis[x][y][rx][ry]=step+;
q.push(make_pair(rx,ry));
vis[rx][ry]=;
}
}
}
} int main()
{
freopen("camelot.in","r",stdin);
freopen("camelot.out","w",stdout);
scanf("%d%d",&n,&m);
scanf("%s",ch+);kingy=(int)ch[]-'A'+;
scanf("%d",&kingx);kingx=n-kingx+;
while(scanf("%s",ch+)!=EOF)
{
knight[++cnt].y=(int)ch[]-'A'+;
scanf("%d",&knight[cnt].x);
knight[cnt].x=n-knight[cnt].x+;
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
for(int a=;a<=n;a++)
for(int b=;b<=m;b++)
dis[i][j][a][b]=inf;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
bfs(i,j);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
int tmp=;
for(int k=;k<=cnt;k++)
tmp+=dis[knight[k].x][knight[k].y][i][j];
ans=min(ans,tmp+max(abs(kingx-i),abs(kingy-j)));
//先考虑国王不被帮助运送的情况
for(int k=;k<=cnt;k++)
{//需要重开变量,不能偷懒用tmp直接减,否则会一直减
int tmpp=tmp-dis[knight[k].x][knight[k].y][i][j];
if(tmp>=ans) continue;//最优性剪枝
for(int l=;l<=n;l++)
for(int r=;r<=m;r++)
ans=min(ans,tmpp+dis[knight[k].x][knight[k].y][l][r]+dis[l][r][i][j]+max(abs(kingx-l),abs(kingy-r)));
}
}
printf("%d\n",ans);
return ;
}

USACO Training3.3亚瑟王的宫殿【搜索】By cellur925的更多相关文章

  1. 洛谷P1930 亚瑟王的宫殿 Camelot

    P1930 亚瑟王的宫殿 Camelot 19通过 53提交 题目提供者JOHNKRAM 标签USACO 难度提高+/省选- 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 很久以前,亚瑟王和 ...

  2. 洛谷 P1930 亚瑟王的宫殿 Camelot

    传送门 题目大意:棋盘有骑士有王,让所有点跳到一个点,求所有棋子跳的步数和,和最小. 题解:bfs+枚举 王的人生: 1):自己走到聚集点 2):某个骑士来到王这里,两个棋子一起到聚集点 3):王走几 ...

  3. BZOJ 4008 【HNOI2015】 亚瑟王

    题目链接:亚瑟王 这道题好神啊TAT--果然我的dp还是太弱了-- 一开始想了半天的直接dp求期望,结果最后WA的不知所云-- 最后去翻了题解,然后发现先算概率,再求期望--新姿势\(get\). 我 ...

  4. Bzoj4008 [HNOI2015]亚瑟王

    Time Limit: 20 Sec  Memory Limit: 512 MBSec  Special Judge Submit: 1009  Solved: 605[Submit][Status] ...

  5. 【BZOJ4008】[HNOI2015]亚瑟王 期望

    [BZOJ4008][HNOI2015]亚瑟王 Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最 ...

  6. 【BZOJ-4008】亚瑟王 概率与期望 + DP

    4008: [HNOI2015]亚瑟王 Time Limit: 20 Sec  Memory Limit: 512 MBSec  Special JudgeSubmit: 832  Solved: 5 ...

  7. BZOJ 4008 亚瑟王

    Description 小K不慎被LL邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知,亚瑟王是一个看脸的游 ...

  8. BZOJ 4008: [HNOI2015]亚瑟王( dp )

    dp(i, j)表示考虑了前i张牌, 然后还有j轮的概率. 考虑第i+1张牌: 发动的概率 : p = dp(i, j) * (1 - (1-p[i+1])^j) 没发动的概率 : dp(i, j) ...

  9. [BZOJ4008]亚瑟王

    Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 亮.众所周知,亚瑟王是一 ...

随机推荐

  1. 【转载】究竟啥才是互联网架构“高并发”

    一.什么是高并发 高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求. 高并发相关常用的一些指标有响应时间( ...

  2. linux进程间通信消息队列:msgsnd: Invalid argument

    今天写了个消息队列的小测试程序结果send端程序总是出现:msgsnd: Invalid argument,搞了半个小时也没搞明白,后来查资料发现我将(st_msg_buf.msg_type = 0; ...

  3. hibernate工作原理及作用

    转载自 http://www.cnblogs.com/dashi/p/3597969.html#commentform JAVA Hibernate工作原理及为什么要用 hibernate 简介:hi ...

  4. Docker and Go: why did we decide to write Docker in Go?

    Docker and Go: why did we decide to write Docker in Go? | Hacker News https://news.ycombinator.com/i ...

  5. Serializable 序列化 The byte stream created is platform independent. So, the object serialized on one platform can be deserialized on a different platform.

    Java 序列化接口Serializable详解 - 火星猿类 - 博客园 http://www.cnblogs.com/tomtiantao/p/6866083.html 深入理解JAVA序列化 - ...

  6. JavaScript数组的某些操作(一)

    在软件开发的过程中JavaScript的编程在所难免.当中对数组的操作尤为常见,这里介绍一下和JavaScript数组相关的某些操作: 1.删除并返回数组的第一个元素--shift方法: <!D ...

  7. Model drivern

    <s:hidden name="id" value="%{role.id}"></s:hidden> 其中的value传到后台是有类型的 ...

  8. Tomcat调优策略

    Jmeter压力测试工具 JMeter是一款在国外非常流行和受欢迎的开源性能测试工具,像LoadRunner 一样,它也提供了一个利用本地Proxy Server(代理服务器)来录制生成测试脚本的功能 ...

  9. YTU 2391: 求素数

    2391: 求素数 时间限制: 1 Sec  内存限制: 128 MB 提交: 116  解决: 3 题目描述 设计一个程序,输出所有小于等于n(n为一个大于2的正整数)的素数. 要求:(1)每行输出 ...

  10. ubuntu中使用apt-get安装zbar

    apt-get是linux中常用的shell命令,适用于deb包管理式的操作系统,主要用于自动从互联网的软件仓库中搜索.安装.升级.卸载软件或操作系统.apt-get命令一般需要root权限执行,所以 ...