恶心的题啊 。。

先枚举哪个点是所有人集合的点 再枚举所有骑士遇见国王的点 如果全部枚举出来会大大的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)的更多相关文章

  1. 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

    图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则 ...

  2. 深搜(DFS)广搜(BFS)详解

    图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...

  3. 【算法导论】图的广度优先搜索遍历(BFS)

    图的存储方法:邻接矩阵.邻接表 例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表: ...

  4. 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现

    1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...

  5. 【BZOJ5492】[HNOI2019]校园旅行(bfs)

    [HNOI2019]校园旅行(bfs) 题面 洛谷 题解 首先考虑暴力做法怎么做. 把所有可行的二元组全部丢进队列里,每次两个点分别向两侧拓展一个同色点,然后更新可行的情况. 这样子的复杂度是\(O( ...

  6. 深度优先搜索(DFS)和广度优先搜索(BFS)

    深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...

  7. 图的 储存 深度优先(DFS)广度优先(BFS)遍历

    图遍历的概念: 从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph).图的遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础.图的 ...

  8. 数据结构与算法之PHP用邻接表、邻接矩阵实现图的广度优先遍历(BFS)

    一.基本思想 1)从图中的某个顶点V出发访问并记录: 2)依次访问V的所有邻接顶点: 3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到. 4) ...

  9. 层层递进——宽度优先搜索(BFS)

    问题引入 我们接着上次“解救小哈”的问题继续探索,不过这次是用宽度优先搜索(BFS). 注:问题来源可以点击这里 http://www.cnblogs.com/OctoptusLian/p/74296 ...

随机推荐

  1. 第三篇:gradle 编译 Android app 概览

    引言:经过上两篇的论述,我们已经从代码到架构都简单的熟悉了一遍,理论上,只要知道android app的编译过程,我们大可以自己写一份用gradle编译app的插件,插件内将将整个流程用Task的依赖 ...

  2. 使用PDO连接多种数据库

    在PHP 5之前,想要连接MySQL数据库就需要使用mysql或mysqli等一系列函数来操作数据库.例如,我们使用mysql系列数据库函数进行查询操作,对应的示例代码如下: <?php //创 ...

  3. 关于C++对汉字拼音的处理(2)

    对于前面获取字符串汉字全拼音的功能,大家应该有个了解了.现在我又综合广大网友流传的获取字符串汉字拼音首字母的功能进行了整理.介绍如下 这个功能写的稍微有点复杂 使用3个函数解决了获取字符串汉字首拼音串 ...

  4. struts2初印象

    第一次写这么正式的文章,如果写的不好的地方,请指出. 今天玩了一下struts2,不过貌似是我被他玩了.简要笔记如下: 一.配置struts2(在eclipse Helios版本下) (1)先创建一个 ...

  5. ASP.NET服务端基本控件介绍

    ASP.NET服务端基本控件介绍 大概分为三种控件: HTML控件,ASP.NET把HTML控件当成普通字符串渲染到浏览器端,不去检查正确性,无法在服务端进行处理ASP.NET服务端控件,经过ASP. ...

  6. python 自动化之路 day 03

    内容目录: 1. 字典 2. 集合 3. 文件处理 4. 字符编码   1. 字典操作 字典一种key - value 的数据类型,使用就像我们上学用的字典,通过笔划.字母来查对应页的详细内容. 语法 ...

  7. 【实习记】2014-09-04浏览代码查middle资料+总结我折腾过的源码浏览器

        浏览着代码,看源码可以先看make文件,make文件有制造的流程信息. 一般可以从运行的程序对应的cpp看起.然而如果有框架,那就不容易了,会关系错纵复杂. 总结一下我折腾过的源码阅读器. s ...

  8. C#基础(二)——C#中的构造函数

    构造函数主要是用来创建对象时为对象赋初值来初始化对象.总与new运算符一起使用在创建对象的语句中 .A a=new A(); 构造函数具有和类一样的名称:但它是一个函数具有函数的所有特性,同一个类里面 ...

  9. yii2源码学习笔记(十八)

    View继承了component,用于渲染视图文件:yii2\base\View.php <?php /** * @link http://www.yiiframework.com/ * @co ...

  10. MAC 终端快捷建

    常用的快捷键: Ctrl + d        删除一个字符,相当于通常的Delete键(命令行若无所有字符,则相当于exit:处理多行标准输入时也表示eof) Ctrl + h        退格删 ...