usaco3.33Camelot(BFS)
恶心的题啊 。。
先枚举哪个点是所有人集合的点 再枚举所有骑士遇见国王的点 如果全部枚举出来会大大的TLE 经大牛验证 只需要枚举国王周围的点就可以了+-2 之内
然后各种繁琐 各种错误 骑士有可能不带着国王一块走 也可能在他周围选个点带着走 先预处理出来每个骑士到国王周围的最短距离 然后再按上面的枚举就可以了
考虑的不全面 。。错了好多个样例 样例2,6,19,20 都模拟了一遍。。还好错在小数据上 可以手算模拟一下 就知道哪错了 变量名都被我用穷了。。
/*
ID: shangca2
LANG: C++
TASK: camelot
*/
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<cmath>
#include<queue>
#define INF 0x3f3f3f
using namespace std;
int vis[][],dis[][] = {{,},{,-},{,},{,-},{-,-},{-,},{-,},{-,-}};
typedef struct node
{
int x,y,num;
}st;
st qq[];
int o[][][][],x[],y[],n,m,ans,xx,yy,f[][],g;
int ff[][],di,s;
int judge(int x,int y)
{
if(x<=||y<=||x>n||y>m)
return ;
return ;
}
int bfs(int xi,int yi,int e1,int e2,int flag)
{
queue<st>q;
s=;int ss=;
memset(vis,,sizeof(vis));
memset(ff,,sizeof(ff));
int i;
st tt,te;
tt.x = xi;
tt.y = yi;
tt.num = ;
vis[xi][yi] = ;
q.push(tt);
int fff = ;
while(!q.empty())
{
tt = q.front();
q.pop();
if(flag&&tt.x==e1&&tt.y==e2)
{
fff = ;
return tt.num;
}
o[xi][yi][tt.x][tt.y] = tt.num;
o[tt.x][tt.y][xi][yi] = tt.num;
if(f[tt.x][tt.y])
ss+=tt.num;
if(ss>ans)
return -;
for(i = ;i < ; i++)
{
int tx = tt.x+dis[i][];
int ty = tt.y+dis[i][];
if(judge(tx,ty)&&!vis[tx][ty])
{
te.x = tx;
te.y = ty;
te.num = tt.num+;
vis[tx][ty] = ;
q.push(te);
}
}
}
if(flag&&!fff)
return INF;
for(i = ; i <= g ;i++)
s+=o[xi][yi][x[i]][y[i]];
return s;
}
int main()
{
freopen("camelot.in","r",stdin);
freopen("camelot.out","w",stdout);
int i,j,k,e,ee;
for(i = ;i <= ; i++)
for(j = ;j <= ; j++)
for(e = ;e <= ; e++)
for(ee = ;ee <= ; ee++)
o[i][j][e][ee] = INF;
char c;
ans = INF;
cin>>n>>m;
cin>>c>>xx;
yy = c-'A'+;
while(cin>>c>>k)
{
int yg = c-'A'+;
int xg = k;
g++;
x[g] = xg;
y[g] = yg;
f[xg][yg] = ;
}
int dd[][] = {,,,,,-,,,-,,,,,-,-,,-,-,,,,,,,,-,,-,
-,,-,,-,,-,-,-,-,,,,,-,,,-,,-,-,-};
for(e = ; e <= g ;e++)
{
for(ee = ; ee < ; ee++)
{
int tx = xx+dd[ee][];
int ty = yy+dd[ee][];
if(judge(tx,ty))
{
int oo = bfs(x[e],y[e],tx,ty,);
if(oo!=INF)
{
o[tx][ty][x[e]][y[e]] = oo;
o[x[e]][y[e]][tx][ty] = oo;
}
}
}
}
int dis = INF;
for(i = ; i <= n ; i++)
for(j = ; j <= m ; j++)
{
if(bfs(i,j,,,)<)
continue;
int ko = bfs(i,j,,,);
int tns = ko+max(abs(i-xx),abs(j-yy));
if(tns<ans)
ans = tns; if(g==)
ans = ko;
for(e = ; e <= g ;e++)
{
for(ee = ; ee < ; ee++)
{
int tx = xx+dd[ee][];
int ty = yy+dd[ee][];
int o1 = o[x[e]][y[e]][tx][ty],o2 = o[i][j][tx][ty],o3 = o[i][j][x[e]][y[e]];
if(o1==INF||o2==INF||o3==INF)
continue;
if(judge(tx,ty)&&ans>(o1+o2-o3+ko+max(abs(tx-xx),abs(ty-yy))))
{
ans = o1+o2-o3+ko+max(abs(tx-xx),abs(ty-yy));
}
}
}
}
cout<<ans<<endl;
return ;
}
usaco3.33Camelot(BFS)的更多相关文章
- 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)
图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则 ...
- 深搜(DFS)广搜(BFS)详解
图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...
- 【算法导论】图的广度优先搜索遍历(BFS)
图的存储方法:邻接矩阵.邻接表 例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表: ...
- 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现
1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...
- 【BZOJ5492】[HNOI2019]校园旅行(bfs)
[HNOI2019]校园旅行(bfs) 题面 洛谷 题解 首先考虑暴力做法怎么做. 把所有可行的二元组全部丢进队列里,每次两个点分别向两侧拓展一个同色点,然后更新可行的情况. 这样子的复杂度是\(O( ...
- 深度优先搜索(DFS)和广度优先搜索(BFS)
深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...
- 图的 储存 深度优先(DFS)广度优先(BFS)遍历
图遍历的概念: 从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph).图的遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础.图的 ...
- 数据结构与算法之PHP用邻接表、邻接矩阵实现图的广度优先遍历(BFS)
一.基本思想 1)从图中的某个顶点V出发访问并记录: 2)依次访问V的所有邻接顶点: 3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到. 4) ...
- 层层递进——宽度优先搜索(BFS)
问题引入 我们接着上次“解救小哈”的问题继续探索,不过这次是用宽度优先搜索(BFS). 注:问题来源可以点击这里 http://www.cnblogs.com/OctoptusLian/p/74296 ...
随机推荐
- python中关于正则表达式二
2.2 反向引用 \1, \2... 表达式在匹配时,表达式引擎会将小括号 "( )" 包含的表达式所匹配到的字符串记录下来.在获取匹配结果的时候,小括号包含的表达式所匹配到的字符 ...
- MVC小系列(一)【制作表格】
在Razor引擎中,对于在表格中进行遍历时,一般会这样写 复制代码 <table border="> @{ ; i < ; i++) { <tr> <td ...
- A题笔记(13)
Evaluate Reverse Polish Notation Reverse Words in a String 类似的,需要将原序列后序排列的时候,都可以用 栈 来实现 stack<int ...
- ReactiveCocoa 入门学习 (一)
引言 现在由于需求的不断发展,MVC这个经典的框架由于Controller的任务越来越多,显得"臃肿"了,网上又推出了新的框架,比如MVVM,ReactiveCocoa, 今天就来 ...
- 【培训】交换机VLAN
为了解决用交换机做LAN互联无法限制广播的问题,出现了VLAN技术,把一个LAN划分为多个逻辑的“LAN”-VLAN. VLAN技术将一个物理的LAN逻辑地划分为不同的广播域,每一个VLAN包含一组有 ...
- wap开发之滑动事件(swipe、tap、swipeleft、swiperight)等
最近一直找在wap端可以实现的swipe等滑动事件的方法,开始研究了jquery-mobile,zepto,结果由于jqm太大.zepto有不少缺陷.为此研究了zepto,想把里面的swipe事件独立 ...
- Invoke()方法的使用
在多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做法,Invoke 和 BeginInvoke 就是为了解决这个问题而出现的,使你在多线程中安全的更新界 ...
- H-UI的前端处理验证,判断是否已经存在,比较健全的模板,可以自己添加一些校验
<input type="text" class="input-text" value="${detail.supportingname }&q ...
- REST接口规范
参考文章 这篇文章使用不同的method代表不同操作 http://www.cnblogs.com/tommyli/p/3913018.html 实际应用中(我们过去的应用) 则是直接使用url来代表 ...
- javascript读取本地文件
由于浏览器考虑到安全问题,在修改本地文件方面除了IE几乎都不支持. IE例子 //读文件 function readFile(filename){ var fso = new ActiveXObjec ...