礼物

时间限制: 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. 安徽师大附中%你赛day7 T2 乘积 解题报告

    乘积 题目背景 \(\mathrm{Smart}\) 最近在潜心研究数学, 他发现了一类很有趣的数字, 叫做无平方因子数. 也就是这一类数字不能够被任意一个质数的平方整除, 比如\(6\).\(7\) ...

  2. [BJOI2006]狼抓兔子——最小割转对偶图最短路

    其实这个题直接Dinic跑最小割可过. (小优化是: 无向图建网络流,一条边不用建成4条,可以正反容量都是边权即可.完全等价 ) [无效]网络流之转换对偶图 一个巧妙的事情是,如果建边合适的话,最小割 ...

  3. 【BZOJ 2553】[BeiJing2011]禁忌 AC自动机+期望概率dp

    我一开始想的是倒着来,发现太屎,后来想到了一种神奇的方法——我们带着一个既有期望又有概率的矩阵,偶数(2*id)代表期望,奇数(2*id+1)代表概率,初始答案矩阵一列,1的位置为1(起点为0),工具 ...

  4. Backup and Restore MySQL Database using mysqlhotcopy

    mysqlhotcopy is a perl script that comes with MySQL installation. This locks the table, flush the ta ...

  5. 兔子与兔子 [Hash]

    兔子与兔子 描述 很久很久以前,森林里住着一群兔子.有一天,兔子们想要研究自己的 DNA 序列.我们首先选取一个好长好长的 DNA 序列(小兔子是外星生物,DNA 序列可能包含 26 个小写英文字母) ...

  6. 简单瞎搞题(bitset的操作)

    链接:https://www.nowcoder.com/acm/contest/132/C来源:牛客网 题目 一共有 n个数,第 i 个数是 xi  xi 可以取 [li , ri] 中任意的一个值. ...

  7. Google File System中文版

    英文原文地址: Google File system 译文原文地址: The Google File System中文版 Google File System中文版 摘要 我们设计并实现了Google ...

  8. CSS3奇偶选择器

    .search-form td:nth-child(odd){//奇 width:100px; text-align:right;} .search-form td:nth-child(even){/ ...

  9. HDU 4320 Arcane Numbers 1 (数论)

    A - Arcane Numbers 1 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64 ...

  10. swift网址

    http://www.cocoachina.com/industry/20140613/8818.html Swift -- 中文版两大官方文档汇总发布于:2014-06-13 15:34阅读数:22 ...