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 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 亮.众所周知,亚瑟王是一 ...
随机推荐
- POJ 3414:Pots
Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11661 Accepted: 4940 Special J ...
- 代码调试过程中easy遇到的问题
前两天身体有些不舒服,也没写啥新文章,昨天下了一天的雨.今天阳光明媚,空气也非常新奇.心情大好. 继翻译为什么输出是String而不是Object,今天先写一下调试方面的东西.java中自带的函数调试 ...
- 用python编写的简易端口扫描器
#coding = utf-8 ''' python 3.4 通过简单的TCP端口连接来判断指定IP是否开放了指定端口. ''' import socket import optparse impor ...
- TopSelf安装Windows服务提示:执行未经授权的操作。。
在一个项目中用到了八九个服务,服务的执行时间也是五花八门,有的年末执行一次,有的月中执行一次,有的月末最后一天执行一次,有的月初连续执行5天, 有的每天晚上执行,...还好各个服务并没有严格的关联关系 ...
- Unable to resolve target android-5解决方案
1:问题:android导入项目的时候出现此错误 2:原因: 3:解决: 修改工程目录下的default.properties文件里的内容target=android-5 这个5修改成你的api版本就 ...
- (C/C++)register关键字
register:这个关键字的作用是请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率. 注意是尽可能,不是绝对.一个CPU 的寄存器也就那么几个或几十个,你要是定义了 ...
- (linux)初学者学linux块设备驱动
面对不断升级的linux内核.GNU开发工具.linux环境下的各种图形库,很多linux应用程序开发人员和linux设备驱动开发人员即兴奋,又烦躁.兴奋的是新的软件软件.工具给我提供了更强大的功 ...
- vue 做登陆页面 ( 登陆成功后去掉注册和登陆按钮 显示用户名)
1.当登陆成功 显示用户名且去掉登陆和注册按钮 2.data里声明 后 就在登陆的方法里调用啦 下面说一下登陆的方法. 1.登陆的按钮代码在第一张图片里 2.登陆的弹出框 3.方法 ps:另一种 ...
- Luogu网校听课笔记(自用
TG助学课——noilinux 8.2 深夜 Noi Linux的使用——darkflames的博客 #include<bits/stdc++.h> using namespace std ...
- bzoj 5072 小A的树 —— 树形DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5072 由于对于一个子树,固定有 j 个黑点,连通块大小是一个连续的范围: 所以记 f[i][ ...