题意:给出一个n×m的矩形区域,每个位置是空地、炸弹、财宝、障碍中的一个,现在要求走一个封闭区域,使得围起来的区域中不能有炸弹,只有空地可以走,最后的得分为被围起来的财宝的价值总和减所走的步数,问能得到的最大的分数为多少。


思路:最开始没注意财宝的位置不能走,想半天也没想明白。。。按照题中给的方法,我们先选一个方向,这是图中的点发出的射线的方向。对于每走一歩,我们可以找出走的这个线段是否被某个炸弹或财宝发出的射线穿过。用两个二进制数分别表示财宝和炸弹被围起来的情况,bfs求dp[sx][sy][i][0]就行了,最后枚举状态i,求最大值。


代码:

#include <iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#define inf 0x3f3f3f3f
#define Inf 0x3FFFFFFFFFFFFFFFLL
#define eps 1e-9
#define pi acos(-1.0)
using namespace std;
typedef long long ll;
const int maxn=1<<8;
const int dirx[4]={1,0,-1,0};
const int diry[4]={0,1,0,-1};
struct Node
{int x,y,st,sb;Node(){};Node(int xx,int yy,int tt,int bb){x=xx;y=yy;st=tt;sb=bb;}
};
int d[25][25][maxn][maxn],bomb[10][2],t[10][2];
int n,m,bnt,tnt,sx,sy,val[10];
char mz[25][25];
inline bool check(int x,int y)
{return x>=0&&x<n&&y>=0&&y<m&&mz[x][y]=='.';
}
void bfs()
{queue<Node>q;d[sx][sy][0][0]=0;q.push(Node(sx,sy,0,0));Node node;int dx,dy,dt,db;while(!q.empty()){node=q.front();q.pop();for(int i=0;i<4;++i){dx=node.x+dirx[i];dy=node.y+diry[i];if(!check(dx,dy)) continue;dt=node.st;db=node.sb;if(i&1){for(int j=0;j<tnt;++j){if(i==1&&t[j][1]==dy&&t[j][0]>node.x)dt^=(1<<j);else if(i==3&&t[j][1]==node.y&&t[j][0]>node.x)dt^=(1<<j);}for(int j=0;j<bnt;++j){if(i==1&&bomb[j][1]==dy&&bomb[j][0]>node.x)db^=(1<<j);else if(i==3&&bomb[j][1]==node.y&&bomb[j][0]>node.x)db^=(1<<j);}}if(d[dx][dy][dt][db]!=-1) continue;d[dx][dy][dt][db]=d[node.x][node.y][node.st][node.sb]+1;q.push(Node(dx,dy,dt,db));}}
}
int main()
{//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);scanf("%d%d",&n,&m);memset(d,0xff,sizeof(d));bnt=tnt=0;for(int i=0;i<n;++i){scanf("%s",mz[i]);for(int j=0;j<m;++j){if(mz[i][j]=='S') {sx=i,sy=j;mz[i][j]='.';}else if(mz[i][j]>='1'&&mz[i][j]<='8'){t[(int)mz[i][j]-'0'-1][0]=i;t[(int)mz[i][j]-'0'-1][1]=j;tnt++;}else if(mz[i][j]=='B') {bomb[bnt][0]=i;bomb[bnt++][1]=j;}}}for(int i=0;i<tnt;++i)scanf("%d",&val[i]);bfs();int ans=0;for(int i=1;i<(1<<tnt);++i){int sum=0;if(d[sx][sy][i][0]==-1) continue;for(int j=0;j<tnt;++j)if(i&(1<<j))sum+=val[j];sum-=d[sx][sy][i][0];ans=max(ans,sum);}printf("%d\n",ans);return 0;
}

CF 375C Circling Round Treasures(状态压缩+bfs)相关推荐

  1. CF 375C Circling Round Treasures [DP(spfa) 状压 射线法]

    C - Circling Round Treasures 题意: 在一个$n*m$的地图上,有一些障碍,还有a个宝箱和b个炸弹.你从(sx,sy)出发,走四连通的格子.你需要走一条闭合的路径,可以自交 ...

  2. 状压搜索 Circling Round Treasures:CodeForces - 375C

    题目:Circling Round Treasures:CodeForces - 375C 题意: 给你一个N*M的地图(N,M<=20),地图上'#'表示障碍物,'B'表示炸弹,数字表示宝藏( ...

  3. Circling Round Treasures(codeforces 375c)

    题意:要求在一张网格图上走出一条闭合路径,不得将炸弹包围进去,使围出的总价值减去路径长度最大. /*类似于poj3182的做法,只不过出现了多个点,那么就用状态压缩的方法记录一个集合即可. */ #i ...

  4. hdu5094(上海邀请赛E) 状态压缩bfs:取钥匙开门到目的地

    貌似和前段时间的一场网络赛一个类型,状态压缩判断走没走过,然后裸bfs到终点. 其实这类题目很简单就是一个bfs模板,无非就是有一些坑,比如这一题..一个格子可以有多把钥匙汗== 1 #include ...

  5. hdu4845 状态压缩BFS

    题意:      给一个n*m的矩阵,从11,走到nm,格子和格子之间可能有墙,也可能有门,有的格子上面有钥匙,相应的钥匙开相应的们,捡钥匙和开门都不需要时间,问你最少多少部能走到nm. 思路:   ...

  6. CF221C Circling Round Treasures

    题目大意 给定一个$n\times m$的网格$(n,m\leq 20)$,每个格子都是$S\space \#\space B\space x\space .$中第一个. $S$表示起点,保证有且仅有 ...

  7. CodeForces 906C(状态压缩 +BFS)

    题目链接 题意:某人举办了一个party,邀请了他的朋友来,他的朋友也邀请了他们的朋友.etc.然后某人并不认识他朋友的朋友,这样聊天很尬,所以就让邀请他不认识的人的朋友给某人介绍.假设通过朋友C介绍 ...

  8. noi 7221 拯救公主 (状态压缩+bfs)

    /* 这题实在调糊了 借鉴的题解的一些判断方法 位运算大法好 - - 因为要集齐所有的宝石所以状态压缩一下 f[i][j][s]将s化为二进制 每一0表示该宝石没有 1表示该宝石有 有:到(i,j)这 ...

  9. POJ 1753 Flip Game (黑白棋) (状态压缩+BFS)

    题目大意:有一个4*4的方格,每个方格中放一粒棋子,这个棋子一面是白色,一面是黑色.游戏规则为每次任选16颗中的一颗,把选中的这颗以及它四周的棋子一并反过来,当所有的棋子都是同一个颜色朝上时,游戏就完 ...

最新文章

  1. ajax实现下拉列表联动
  2. SAP UI5 local sandbox bootstrap的执行细节
  3. 终于弄明白了 Singleton,Transient,Scoped 的作用域是如何实现的
  4. 国货在崛起,八成都做对了这件事
  5. python二级考试程序题批改_随机生成百以内加减乘除题目并批改
  6. 如何启用“锁定内存页”选项 (Windows)
  7. shell for循环命令行_24 道 shell 脚本面试题
  8. Asp.Net母版页元素ID不一致的体现
  9. R语言各个包里面的数据集
  10. 串口通信实例vb.net serialport
  11. 网络营销优势有哪些?
  12. elasticsearch创建索引和mapping
  13. 两个tplink路由器有线桥接_【设置教程】TP-Link路由器有线桥接
  14. IT行业英语自我介绍必备
  15. 西北工业大学计算机毕业论文,西北工业大学本科生毕业设计(论文)工作管理办法.docx...
  16. 尚硅谷nginx笔记
  17. tableau:人口金字塔图
  18. 华为高管又出事了!涉嫌受贿被带走!拿着几百万年薪,为啥还要贪?
  19. 【有利可图网】PS实战教程36:巧用PS制作人物破碎消散效果
  20. 手机短号(C语言————AC)

热门文章

  1. Google镜像代理地址:
  2. 互联网大厂的后端技术栈
  3. 英语读书笔记-Book Lovers Day 11
  4. 2021年衡水中学高考成绩查询,2019年衡水中学的高考成绩会怎样,看看往年的战绩就明白了...
  5. Cent OS几个好玩的命令
  6. 东北天坐标系、西安80坐标系如何在mars3d加载?
  7. VPB测试 使用Osgdem运行例子
  8. 如何记账?记账过程中几个实用的技巧
  9. 计算机替代手工记账的影响,计算机记账替代手工记账的条件
  10. 老用户无法开互联网定制套餐?工信部责令三大运营商整改