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 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 亮.众所周知,亚瑟王是一 ...
随机推荐
- sqlite学习笔记10:C语言中使用sqlite之查询和更新数据
前面说到的 sqlite_exec() 中的第三个參数, SQLite 将为 sql 參数内运行的每一个 SELECT 语句中处理的每一个记录调用这个回调函数. 本节加入了两个函数.selectFro ...
- bzoj 1030: [JSOI2007]文本生成器 (ac自己主动机上的dp)
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2635 Solved: 1090 [id=1030&qu ...
- Android学习笔记(十)——使用意图链接活动
使用意图链接活动 1.新建一个名为"UsingIntent"的项目,右击src目录下的包名,选择New-->Class选项.并将新的类文件名称命名为"SecondA ...
- Nova虚拟机迁移
这里根据我的配置环境只讲述冷迁移(Migrate Instance)需要进行的计算节点配置而不包含热迁移(Live Migrate Instance),后者需要共享存储及Hypervisor的支持. ...
- Dell服务器相关操作
1. Raid相关: # 删除已有的Raid配置 MegaCli64 -CfgLdDel -LALL -aALL # 获取设备ID和槽号 MegaCli64 -PDList -aALL|egrep ' ...
- unity视频播放,
PC端视频播放: Unity中实现PC端播放视频,非常easy用到MovieTexture属于贴图Texture的子类. 在播放视频之前.我们得记得下载quicktime插件,仅仅有导入了quickt ...
- ORACLE数据库忘记SYS和SYSTEM密码,SYSTEM被锁定怎么办?
本人忘性太大,竟然将ORACLE的Sys用户和system用户密码搞忘,而且多次尝试登录system后,造成system被锁定. 经过一番尝试,终于解决.过程如下: 首先,重建sys密码文件.重建方式 ...
- Mac使用小结
1.修改pip的镜像地址及更新pip https://www.cnblogs.com/techroad4ca/p/5922389.html 2.更新python的库,比如更新six sudo pip ...
- Linux下编译安装源码包软件 configure ,make, make install, make test/check, make clean
http://www.360doc7.net/wxarticlenew/541275971.html 一.什么是源码包软件? 顾名思义,源码包就是源代码的可见的软件包,基于Linux和BSD系统的软件 ...
- 计算(!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]
(!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]] 一.JS运算符的优先级 首先要运用到的第一个 ...