USACO Training3.3亚瑟王的宫殿【搜索】By cellur925
因为太蒟了,所以参考了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的更多相关文章
- 洛谷P1930 亚瑟王的宫殿 Camelot
P1930 亚瑟王的宫殿 Camelot 19通过 53提交 题目提供者JOHNKRAM 标签USACO 难度提高+/省选- 提交 讨论 题解 最新讨论 暂时没有讨论 题目描述 很久以前,亚瑟王和 ...
- 洛谷 P1930 亚瑟王的宫殿 Camelot
传送门 题目大意:棋盘有骑士有王,让所有点跳到一个点,求所有棋子跳的步数和,和最小. 题解:bfs+枚举 王的人生: 1):自己走到聚集点 2):某个骑士来到王这里,两个棋子一起到聚集点 3):王走几 ...
- BZOJ 4008 【HNOI2015】 亚瑟王
题目链接:亚瑟王 这道题好神啊TAT--果然我的dp还是太弱了-- 一开始想了半天的直接dp求期望,结果最后WA的不知所云-- 最后去翻了题解,然后发现先算概率,再求期望--新姿势\(get\). 我 ...
- Bzoj4008 [HNOI2015]亚瑟王
Time Limit: 20 Sec Memory Limit: 512 MBSec Special Judge Submit: 1009 Solved: 605[Submit][Status] ...
- 【BZOJ4008】[HNOI2015]亚瑟王 期望
[BZOJ4008][HNOI2015]亚瑟王 Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最 ...
- 【BZOJ-4008】亚瑟王 概率与期望 + DP
4008: [HNOI2015]亚瑟王 Time Limit: 20 Sec Memory Limit: 512 MBSec Special JudgeSubmit: 832 Solved: 5 ...
- BZOJ 4008 亚瑟王
Description 小K不慎被LL邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知,亚瑟王是一个看脸的游 ...
- BZOJ 4008: [HNOI2015]亚瑟王( dp )
dp(i, j)表示考虑了前i张牌, 然后还有j轮的概率. 考虑第i+1张牌: 发动的概率 : p = dp(i, j) * (1 - (1-p[i+1])^j) 没发动的概率 : dp(i, j) ...
- [BZOJ4008]亚瑟王
Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 亮.众所周知,亚瑟王是一 ...
随机推荐
- JQUERY多选框,单选框,检查选中的值
var str=""; $(":checkbox:checked").each(function(){ if($(this).attr("checke ...
- SQL server 数据库
SQL server 的开启关闭和暂停 数据库表格
- Codeforces Round #148 (Div. 1)
A wool sequence 表示一个序列中能够找到一个连续的子区间使得区间异或值为0 那么求的是不含这样的情况的序列个数 题目中数据范围是.在0~2^m - 1中选n个数作为一个序列 n和m都是1 ...
- Intel Chipsets
http://en.wikipedia.org/wiki/Chipset Chipset From Wikipedia, the free encyclopedia A chipset is ...
- JSP 用poi 读取Excel
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- html5--6-55 动画效果-关键帧动画
html5--6-55 动画效果-关键帧动画 实例 @charset="UTF-8"; div{ width: 150px; height: 150px; font-size: 2 ...
- laya在微信小游戏中加载BitmapFont失效的问题
发布为微信小游戏后,在微信工具中测试时总是提示加载retry to load TheRed.fnt,并以error告终.由于没有任何出错信息,无奈之下只好阅读源码.对BitmapFont的处理分为两个 ...
- jetty源码剖析
最近使用jetty自己写了一个web server,现在闲了花了一天的时间看了一jetty的源代码,主要以server的启动为主线,进行了剖析,经过阅读对jetty的源码大赞,写的简洁.清晰,架构也不 ...
- [Selenium] 操作浏览器前进后退
driver.get("http://1.com"); driver.navigate().to("http://2.com"); driver.navigat ...
- 【NOIP 2003】 加分二叉树
[题目链接] 点击打开链接 [算法] 树形DP即可 [代码] #include<bits/stdc++.h> using namespace std; #define MAXN 50 in ...