CF 375C Circling Round Treasures(状态压缩+bfs)
题意:给出一个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)相关推荐
- CF 375C Circling Round Treasures [DP(spfa) 状压 射线法]
C - Circling Round Treasures 题意: 在一个$n*m$的地图上,有一些障碍,还有a个宝箱和b个炸弹.你从(sx,sy)出发,走四连通的格子.你需要走一条闭合的路径,可以自交 ...
- 状压搜索 Circling Round Treasures:CodeForces - 375C
题目:Circling Round Treasures:CodeForces - 375C 题意: 给你一个N*M的地图(N,M<=20),地图上'#'表示障碍物,'B'表示炸弹,数字表示宝藏( ...
- Circling Round Treasures(codeforces 375c)
题意:要求在一张网格图上走出一条闭合路径,不得将炸弹包围进去,使围出的总价值减去路径长度最大. /*类似于poj3182的做法,只不过出现了多个点,那么就用状态压缩的方法记录一个集合即可. */ #i ...
- hdu5094(上海邀请赛E) 状态压缩bfs:取钥匙开门到目的地
貌似和前段时间的一场网络赛一个类型,状态压缩判断走没走过,然后裸bfs到终点. 其实这类题目很简单就是一个bfs模板,无非就是有一些坑,比如这一题..一个格子可以有多把钥匙汗== 1 #include ...
- hdu4845 状态压缩BFS
题意: 给一个n*m的矩阵,从11,走到nm,格子和格子之间可能有墙,也可能有门,有的格子上面有钥匙,相应的钥匙开相应的们,捡钥匙和开门都不需要时间,问你最少多少部能走到nm. 思路: ...
- CF221C Circling Round Treasures
题目大意 给定一个$n\times m$的网格$(n,m\leq 20)$,每个格子都是$S\space \#\space B\space x\space .$中第一个. $S$表示起点,保证有且仅有 ...
- CodeForces 906C(状态压缩 +BFS)
题目链接 题意:某人举办了一个party,邀请了他的朋友来,他的朋友也邀请了他们的朋友.etc.然后某人并不认识他朋友的朋友,这样聊天很尬,所以就让邀请他不认识的人的朋友给某人介绍.假设通过朋友C介绍 ...
- noi 7221 拯救公主 (状态压缩+bfs)
/* 这题实在调糊了 借鉴的题解的一些判断方法 位运算大法好 - - 因为要集齐所有的宝石所以状态压缩一下 f[i][j][s]将s化为二进制 每一0表示该宝石没有 1表示该宝石有 有:到(i,j)这 ...
- POJ 1753 Flip Game (黑白棋) (状态压缩+BFS)
题目大意:有一个4*4的方格,每个方格中放一粒棋子,这个棋子一面是白色,一面是黑色.游戏规则为每次任选16颗中的一颗,把选中的这颗以及它四周的棋子一并反过来,当所有的棋子都是同一个颜色朝上时,游戏就完 ...
最新文章
- ajax实现下拉列表联动
- SAP UI5 local sandbox bootstrap的执行细节
- 终于弄明白了 Singleton,Transient,Scoped 的作用域是如何实现的
- 国货在崛起,八成都做对了这件事
- python二级考试程序题批改_随机生成百以内加减乘除题目并批改
- 如何启用“锁定内存页”选项 (Windows)
- shell for循环命令行_24 道 shell 脚本面试题
- Asp.Net母版页元素ID不一致的体现
- R语言各个包里面的数据集
- 串口通信实例vb.net serialport
- 网络营销优势有哪些?
- elasticsearch创建索引和mapping
- 两个tplink路由器有线桥接_【设置教程】TP-Link路由器有线桥接
- IT行业英语自我介绍必备
- 西北工业大学计算机毕业论文,西北工业大学本科生毕业设计(论文)工作管理办法.docx...
- 尚硅谷nginx笔记
- tableau:人口金字塔图
- 华为高管又出事了!涉嫌受贿被带走!拿着几百万年薪,为啥还要贪?
- 【有利可图网】PS实战教程36:巧用PS制作人物破碎消散效果
- 手机短号(C语言————AC)