礼物

时间限制: 1 Sec  内存限制: 64 MB
提交: 39  解决: 4
[提交][状态][讨论版]

题目描述

 
 给出一个n行m列的点阵,“.”表示可通行格子,“#”表示不可通行格子,“K”表示国王的初始位置,“Q”表示王后的位置,“G”表示该格子有一个礼
物。注意:国王、王后、礼物所在的格子可以认为是可通行格子。国王从开始位置出发,国王从当前格子可以走到上、下、左、右四个相邻格子,当然前提是可通行
格子。国王从当前格子走到相邻格子的时间是变化的,这取决于国王手头上收集到的礼物的数量,假如当前国王手头上有y个礼物,那么他从当前格子移动到相邻格
子的所用时间是y+l秒。一旦国王进入某个有礼物的格子,他可以选择取该格子的礼物,也可以选择不取该格子的礼物。取礼物这个动作可以认为是瞬间完成的,
不需要时间。国王想收集到尽量多的礼物送给王后,但是他到达王后所在的格子不能超过T秒,王后不想等太长时间。注意:国王在收集礼物的途中可能多次走到相
同的格子。

输入

  第1行:三个整数n、m、T。 1≤n,m≤50,1≤T≤109。
  接下来是n行m列的点阵,‘G’的数量不超过16。只有一个国王,一个王后。

输出

一个整数,国王在规定时间内,最多可以收集到多少个礼物送给王后?

样例输入

5 7 50
#....G#
###G###
#K...Q#
###.###
#G..GG#

样例输出

4
【分析】威哥写的,表示并不懂,立个flag,日后再学,已经看晕了。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <climits>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <list>
#include<functional>
#define mod 1000000007
#define inf 0x3f3f3f3f
#define pi acos(-1.0)
using namespace std;
typedef long long ll;
const int N = (<<)+;
const int INF = 0x3f3f3f3f;
char s[][];
int n,m,T;
struct Node {
int x,y;
Node(int a=,int b=) {
x=a;
y=b;
}
} st,ed;
vector<Node>g;
int d[][],dis[][],f[N][];
int dx[]= {,,-,};
int dy[]= {-,,,};
void bfs(int pos) {
queue<Node>q;
memset(dis,INF,sizeof(dis));
dis[g[pos].x][g[pos].y]=;
q.push(g[pos]);
while(!q.empty()) {
Node u=q.front();
q.pop();
for(int i=; i<; ++i) {
int x=u.x+dx[i],y=u.y+dy[i];
if(x<||x>n||y<||y>m||s[x][y]=='#')continue;
if(dis[x][y]==INF) {
dis[x][y]=dis[u.x][u.y]+;
q.push(Node(x,y));
}
}
}
for(int i=; i<g.size(); ++i)if(i!=pos) {
d[pos][i]=dis[g[i].x][g[i].y];
}
}
int main() {
scanf("%d%d%d",&n,&m,&T);
for(int i=; i<=n; ++i)scanf("%s",s[i]+);
for(int i=; i<=n; ++i) {
for(int j=; j<=m; ++j) {
if(s[i][j]=='K')st=Node(i,j);
else if(s[i][j]=='Q')ed=Node(i,j);
else if(s[i][j]=='G')g.push_back(Node(i,j));
}
}
g.push_back(st);
g.push_back(ed);
memset(d,INF,sizeof(d));
memset(f,INF,sizeof(f));
for(int i=; i<g.size()-; ++i)bfs(i);
int ss=g.size()-,tt=g.size()-,tot=(<<(g.size()-));
for(int i=; i<g.size()-; ++i) {
f[<<i][i]=d[ss][i];
}
for(int i=; i<tot; ++i) {
for(int j=; j<g.size()-; ++j) {
if(!(i&(<<j))||f[i][j]>=INF)continue;
for(int k=; k<g.size()-; ++k) {
if((i&(<<k))||d[j][k]>=INF)continue;
f[i|(<<k)][k]=min(f[i][j]+(__builtin_popcount(i)+)*d[j][k],f[i|(<<k)][k]);
}
}
}
int ret=;
for(int i=; i<tot; ++i) {
for(int j=; j<g.size()-; ++j) {
if(f[i][j]!=INF||d[j][tt]!=INF) {
int tmp=f[i][j]+(__builtin_popcount(i)+)*d[j][tt];
if(tmp<=T) ret=max(ret,__builtin_popcount(i));
}
}
}
printf("%d\n",ret);
return ;
}

礼物(BFS)的更多相关文章

  1. BZOJ 3438 小M的礼物

    BZOJ 3438 小M的礼物 Description 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子 有1个(就是可以种一棵作物)(用1. ...

  2. jQuery动画-圣诞节礼物

    ▓▓▓▓▓▓ 大致介绍 下午看到了一个送圣诞礼物的小动画,正好要快到圣诞节了,就动手模仿并改进了一些小问题 原地址:花式轮播----圣诞礼物传送 思路:动画中一共有五个礼物,他们平均分布在屏幕中,设置 ...

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

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

  4. 【BZOJ-1656】The Grove 树木 BFS + 射线法

    1656: [Usaco2006 Jan] The Grove 树木 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 186  Solved: 118[Su ...

  5. POJ 3278 Catch That Cow(bfs)

    传送门 Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 80273   Accepted: 25 ...

  6. POJ 2251 Dungeon Master(3D迷宫 bfs)

    传送门 Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 28416   Accepted: 11 ...

  7. Sicily 1215: 脱离地牢(BFS)

    这道题按照题意直接BFS即可,主要要注意题意中的相遇是指两种情况:一种是同时到达同一格子,另一种是在移动时相遇,如Paris在(1,2),而Helen在(1,2),若下一步Paris到达(1,1),而 ...

  8. Sicily 1048: Inverso(BFS)

    题意是给出一个3*3的黑白网格,每点击其中一格就会使某些格子的颜色发生转变,求达到目标状态网格的操作.可用BFS搜索解答,用vector储存每次的操作 #include<bits/stdc++. ...

  9. Sicily 1444: Prime Path(BFS)

    题意为给出两个四位素数A.B,每次只能对A的某一位数字进行修改,使它成为另一个四位的素数,问最少经过多少操作,能使A变到B.可以直接进行BFS搜索 #include<bits/stdc++.h& ...

随机推荐

  1. HDU 6203 ping ping ping(贪心+LCA+DFS序+BIT)

    ping ping ping Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  2. cf 442 D. Olya and Energy Drinks

    cf 442 D. Olya and Energy Drinks(bfs) 题意: 给一张\(n \times m(n <= 1000,m <= 1000)\)的地图 给出一个起点和终点, ...

  3. 工具——SVN常用命令

    SVN一般都是团队合作做一个项目所需用到的,为了是版本的统一 ;1. Check out——从服务器端取得代码    把服务器资料库里存放的某个项目代码取出来,放到本地主机中,这个动作叫做“check ...

  4. SqlServer中临时表的应用

    一.变通处理WHERE后面IN的参数过多 WHERE后面的条IN操作符里的参数比较小时,可以直接使用IN(1,2,3)这样处理,当个数不确定(可能超过1000)时,应该考虑使用临时表关联查询: SEL ...

  5. npm install 权限的问题

    用ctrl+r切换到对象的目录,以管理圆的身份执行 npm cache clean first. If that doesn’t fix things, take a look in %APPDATA ...

  6. HDU 多校对抗第三场 L Visual Cube

    Problem L. Visual Cube Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java ...

  7. Ubuntu1604 install netease-cloud music

    Two issue: 1. There is no voice on my computer, and the system was mute and cannot unmute. eric@E641 ...

  8. css之postion定位

    css position之初识 我们先看看position定位有那几个属性,下面是我从w3c的截图,为我们认识定位做初步的了解 通过上面这张图嘞,我们知道了position有5个属性,那么下面,我就来 ...

  9. 【CF1027E】Inverse Coloring(DP)

    题意:给出一个n*n的矩阵,要求在每个位置涂上黑/白色, 要求满足:任意相邻的两行,其颜色要么完全相同,要么完全相反 任意相邻的两列,其颜色也要么相同要么完全相反 且这个矩形中,不存在任意一个大小大于 ...

  10. 【Atcoder】ARC082 E - ConvexScore

    [算法]计算几何 [题意]给定平面直角坐标系上的若干个点,任意选点连成凸多边形,凸多边形的价值定义为2^(n-|S|),其中n为凸多边形内部点数(含边界),|S|为顶点数,求总价值.n<=10^ ...