洛谷 P1930 亚瑟王的宫殿 Camelot
题目大意:棋盘有骑士有王,让所有点跳到一个点,求所有棋子跳的步数和,和最小。
题解:bfs+枚举
王的人生:
1):自己走到聚集点
2):某个骑士来到王这里,两个棋子一起到聚集点
3):王走几步,遇到骑士,再一起到聚集点
枚举聚集点O(nm),枚举去王那里的骑士O(nm*num),枚举
相遇的点O((nm)^2*num),假设骑士是n*m个,那么时间复
杂度是O((nm)^3)....时间复杂度绝对不行....
模拟一下发现,骑士和国王相遇的点,肯定在国王周围很近
的格子,所以枚举相遇的点复杂度不是O(nm)而是O(几乎没有)
BFS预处理每个点到每个点的最短距离dis[][][][],sum[i][j],表示聚集
点在(i,j)所有骑士都到(i,j)的距离和kingdis[i][j]表示国王到(i,j)的距离。
最后的距离公式是
所有骑士到枚举的聚集点的距离-枚举的骑士到聚集点的距离+枚举的骑
士相遇点的距离+相遇点的距离到聚集点的距离+国王到相遇点的距离。
时间复杂度是O(AC) O(8nm+nm*numk)..我猜的
错因:最后的距离公式加晕头了,少加了一项。dis数组没有初始化,有些点不能跳到某些点。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define inf 2147483647
#define maxn 50
using namespace std; char s[];
int n,m,x,num,ans;
int dis[maxn][maxn][maxn][maxn],king_dis[maxn][maxn];
int vis[maxn][maxn],sum[maxn][maxn];
int mx[]={-,-,-,-,,,,},
my[]={,-,,-,,-,,-};
struct node{
int x,y,ste;
};
queue<node>q;
struct Node{
int x,y;
}king,kni[maxn*maxn]; void BFS(int x,int y){
memset(vis,,sizeof(vis));
while(!q.empty())q.pop();
vis[x][y]=true;
node now;now.x=x;now.y=y;now.ste=;
dis[x][y][x][y]=;
q.push(now);
while(!q.empty()){
node now=q.front();q.pop();
int nx=now.x,ny=now.y,ste=now.ste;
for(int i=;i<;i++){
int nxtx=nx+mx[i],nxty=ny+my[i];
if(nxtx<||nxty<||nxtx>n||nxty>m||vis[nxtx][nxty])continue;
dis[x][y][nxtx][nxty]=dis[x][y][nx][ny]+;
vis[nxtx][nxty]=true;
node tmp;tmp.x=nxtx;tmp.y=nxty;tmp.ste=ste+;
q.push(tmp);
}
}
} int main(){
scanf("%d%d",&n,&m);ans=inf;
scanf("%s%d",s,&x);king.x=x;king.y=s[]-'A'+;
while(scanf("%s%d",s,&x)!=EOF){
kni[++num].x=x;kni[num].y=s[]-'A'+;
}
memset(dis,0x3f,sizeof(dis));
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++)
for(int k=;k<=num;k++)
sum[i][j]+=dis[kni[k].x][kni[k].y][i][j];
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
king_dis[i][j]=max(abs(king.x-i),abs(king.y-j));
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
ans=min(ans,sum[i][j]+king_dis[i][j]);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
for(int k=;k<=num;k++)
for(int nx=king.x-;nx<=king.x+;nx++)
for(int ny=king.y-;ny<=king.y+;ny++)
if(nx<||ny<||nx>n||ny>m)continue;
else ans=min(ans,sum[i][j]-dis[kni[k].x][kni[k].y][i][j]+dis[kni[k].x][kni[k].y][nx][ny]+dis[nx][ny][i][j]+king_dis[nx][ny]);
printf("%d\n",ans);
return ;
}
AC
洛谷 P1930 亚瑟王的宫殿 Camelot的更多相关文章
- 洛谷P1930 亚瑟王的宫殿 Camelot
P1930 亚瑟王的宫殿 Camelot 19通过 53提交 题目提供者JOHNKRAM 标签USACO 难度提高+/省选- 提交 讨论 题解 最新讨论 暂时没有讨论 题目描述 很久以前,亚瑟王和 ...
- USACO Training3.3亚瑟王的宫殿【搜索】By cellur925
题目传送门 因为太蒟了,所以参考了dalao@zbtrs == 对此表示感谢并侵删. 看起来我们就知道这是搜索题. 最后的情况分两种:有骑士背国王/国王自食其力走到集合点. 首先,我们不知道大家 ...
- [洛谷 P3239] [HNOI2015]亚瑟王
[HNOI2015]亚瑟王 题目描述 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知, ...
- 洛谷 P3239 / loj 2112 [HNOI2015] 亚瑟王 题解【期望】【DP】
???看不懂的期望DP 题目描述 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知,亚 ...
- 【洛谷3239_BZOJ4008】[HNOI2015] 亚瑟王(期望 DP)
题目: 洛谷 3239 分析: 卡牌造成的伤害是互相独立的,所以 \(ans=\sum f_i\cdot d_i\) ,其中 \(f_i\) 表示第 \(i\) 张牌 在整局游戏中 发动技能的概率.那 ...
- 洛谷P3239 [HNOI2015]亚瑟王
题目描述 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知,亚瑟王是一个看脸的游戏,技能 ...
- 【洛谷2403】[SDOI2010] 所驼门王的宝藏(Tarjan+dfs遍历)
点此看题面 大致题意: 一个由\(R*C\)间矩形宫室组成的宫殿中的\(N\)间宫室里埋藏着宝藏.由一间宫室到达另一间宫室只能通过传送门,且只有埋有宝藏的宫室才有传送门.传送门分为3种,分别可以到达同 ...
- 【BZOJ4008】[HNOI2015]亚瑟王(动态规划)
[BZOJ4008][HNOI2015]亚瑟王(动态规划) 题面 BZOJ 洛谷 题解 设\(f[i][j]\)表示前\(i\)张卡中有\(j\)张被触发的概率. 分两种情况转移,即当前这张是否被触发 ...
- 【BZOJ4008】[HNOI2015]亚瑟王
[BZOJ4008][HNOI2015]亚瑟王 题面 bzoj 洛谷 题解 由期望的线性性 可以知道,把所有牌打出的概率乘上它的伤害加起来就是答案 记第$i$张牌打出的概率为$fp[i]$ 则 $$ ...
随机推荐
- Tomcat在windows服务器下,将tomcat控制台日志记录到日志文件中
Tomcat在windows服务器下,将tomcat控制台日志记录到日志文件中 在Linux系统中,Tomcat 启动后默认将很多信息都写入到 catalina.out 文件中,我们可以通过tail ...
- PHP面向对象程序设计之抽象类和抽象方法
抽象类: 抽象类不能被实例化.抽象类中只定义(或部分实现)子类需要的方法.子类可以继承它并且通过实现其中的抽象方法,使抽象类具体化. 我们可以用一个abstract关键字来定义一个抽象类,示例如下: ...
- 20145219 《Java程序设计》实验三 敏捷开发与XP实践
20145219 <Java程序设计>实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验步骤 敏捷开发与XP 1.敏捷开发(Agile Development)是 ...
- React Native 网络请求封装:使用Promise封装fetch请求
最近公司使用React作为前端框架,使用了异步请求访问,这里做下总结: React Native中虽然也内置了XMLHttpRequest 网络请求API(也就是俗称的ajax),但XMLHttpRe ...
- Autofac is designed to track and dispose of resources for you.
https://autofaccn.readthedocs.io/en/latest/best-practices/ Autofac is designed to track and dispose ...
- quartz(2) -- 入门案例
第一步:添加jar,maven配置 <!-- quartz --> <dependency> <groupId>org.quartz-scheduler</g ...
- spark学习7(spark2.0集群搭建)
第一步:安装spark 将官网下载好的spark-2.0.0-bin-hadoop2.6.tgz上传到/usr/spark目录下.这里需注意的是spark和hadoop有对应版本关系 [root@sp ...
- U盘安装OS
1. 老毛桃 2. 大白菜 3.
- scala学习手记27 - 下划线与参数
在Scala里,下划线(_)可以表示函数值的参数.如果某个参数在函数里仅使用一次,就可以用下划线表示.每次在函数里用下划线,都表示随后的参数. val arr = Array(1, 2, 3, 4, ...
- Educational Codeforces Round 27
期末后恢复性训练,结果完美爆炸... A,题意:2n个人,分成两队,要求无论怎么分配,第一队打赢第二队 #include<bits/stdc++.h> #define fi first # ...