洛谷 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]$ 则 $$ ...
随机推荐
- shell脚本 入门 —— 符号篇
shell Shell就是一个命令行解释器,它的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive). Shell还有一种执行命令的方式称 ...
- hbase 异常
1.org.apache.hadoop.hbase.ipc.CallTimeoutException a.出现情况描述:使用java API进行hbase数据的scan操作,发现有的数据可以scan到 ...
- 用树状数组求逆序对数(poj2299)
Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 46995 Accepted: 17168 ...
- [BZOJ2717]迷路的兔子[构造]
构造题…当然需要推(看)一推(看)规(题)律(解)啦... 其实是在Discuss那个CA的一句话题解里面翻到这个东西的... 用奇怪的姿势枚举一下...先贴代码 #include<bits/s ...
- 解决com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes异常
错误截图: 解决方法: 用root进入mysql终端,执行以下命令: alter database hive character set latin1;
- html5 如何打包成apk,将H5封装成android应用APK文件的几种方法
直接使用编程软件提供的方法: 1.需要下载安装MyEclipse2014,Android SDK,eclipse(需配置Android开发环境) Java和Android环境安装与配置. 2.打开My ...
- 支付宝VIE的罪与罚
http://tech.ifeng.com/special/tusimple/alibaba/#_www_dt2 雅虎的杨致远.软银的孙正义,都曾是马云阿里巴巴创业路上的贵人,也都曾是相互信任的朋 ...
- 【poj2155】Matrix(二维树状数组区间更新+单点查询)
Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the ...
- 使用Jenkins自动编译我的 java 项目 git maven jenkins
之前的项目已经将jenkins部署好,现在添加maven项目 准备工作 安装插件 Git plugin Publish Over SSH 全局设置 key: 是 linux服务器的私钥 Global ...
- Flask 的 template模板 与 jinja2语法
Flask 的 template模板 与 jinja2语法 Flask使用的是Jinja2模板,所以其语法和Django基本无差别 1.模板基本数据的渲染 变量 {{..}} 列表 {% for it ...