洛谷 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]$ 则 $$ ...
随机推荐
- Apache 优化
1.关闭DNS和名字解析 * HostnameLookups on | off | double 2.关闭客户端主机名解析 Apache .3之前HostnameLookups默认是打开的.这样客户端 ...
- FTP pure-ftpd 安装、管理
FTP简介 FTP是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为文传协议,用户Internet上的控制文件的双向传输. FTP的主要作用,就是让用户链接上一个远 ...
- 黑苹果Yosemite 10.10.1 修改wowpc.iso文件免选择直接启动Mac系统
安装教程见: http://www.cnblogs.com/zouzf/p/4356641.html 网上很多教程都是OK的,但每个人的具体情况不同就可能有一些细节问题搞死你1.本文所指的 wowpc ...
- Moore majority vote algorithm(摩尔投票算法)
Boyer-Moore majority vote algorithm(摩尔投票算法) 简介 Boyer-Moore majority vote algorithm(摩尔投票算法)是一种在线性时间O( ...
- GridView右键菜单
一.添加右键菜单 1.在VS工具箱中的“菜单和工具栏”找到ContextMenuStrip控件,双击添加. 2.点击ContextMenuStrip右上方的小三角形,打开编辑项,可以添加菜单项.至于菜 ...
- scala mapPartitionsWithIndex函数的使用
var rdd1=sc.makeRDD(Array((1,"A"),(2,"B"),(3,"C"),(4,"D")),2 ...
- jmeter-执行多个sql查询语句
1.添加jdbc connection(注意标红部分) 2.添加jdbc request 3.查看结果树
- org.apache.log4j.Logger用法
在应用程序中添加日志记录总的来说基于三个目的 :监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作:跟踪代码运行时轨迹,作为日后审计的依据:担当集成开发环境中的调试器的作用,向文 ...
- Delphi_时间间隔
1. var dtOnlineDateTime, dt: TDateTime; begin dt := StrToDateTime('2017/6/28 16:41:30'); dtOnlineDat ...
- FTP的安装配置使用
///////////////////////////////FTP///////////////////////////////////////////////////写在前面:在linux 环境下 ...