注意到题目中有这一句话:

注意路线可以自交。为了确定一个格子是否在这条路线里面,请使用以下算法判断:
1.假设该点的坐标为需要判断的点为 p(i,j) ,该点不在路线上
2.从该点往任意方向作一条射线,如果与路线相交奇数次,我们就认为这个格子在这条路线里面,否则这个格子在这条路线外面。

我们设f[i][j][k]f[i][j][k]f[i][j][k]表示当前格子为i,ji,ji,j,所有宝藏或炸弹引出的射线与走过的路线相交总数的奇偶性的状态为kkk的最短距离。可以通过一次bfs得到。最后,我们枚举集合,更新答案。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int inf=0x3f3f3f3f;
int n,m,k,bx,by,dis[25][25][305],xx[4]={1,-1,0,0},yy[4]={0,0,1,-1};
char s[25][25];
bool vis[25][25][305];
struct data{int x,y,v;
}a[405];
struct node{int x,y,sta;node(){}node(int x,int y,int sta):x(x),y(y),sta(sta){}
};
queue<node> q;
bool check(int x,int y,int nx,int ny,int id){if(x==nx){return false;}if(x==a[id].x&&y<a[id].y){return nx<x;}if(nx==a[id].x&&ny<a[id].y){return x<nx;}return false;
}
void bfs(){dis[bx][by][0]=0;q.push(node(bx,by,0));while(!q.empty()){int x=q.front().x,y=q.front().y,sta=q.front().sta,nx,ny,nsta;q.pop();for(int i=0;i<4;i++){nx=x+xx[i],ny=y+yy[i];if(nx<1||nx>n||ny<1||ny>m||(s[nx][ny]!='.'&&s[nx][ny]!='S')){continue;}nsta=sta;for(int j=1;j<=k;j++){if(check(x,y,nx,ny,j)){nsta^=(1<<(j-1));}}if(vis[nx][ny][nsta]){continue;}vis[nx][ny][nsta]=true;dis[nx][ny][nsta]=dis[x][y][sta]+1;q.push(node(nx,ny,nsta));}}
}
int gao(){int tmp,ans=0;for(int i=1;i<(1<<k);i++){if(!vis[bx][by][i]){continue;}tmp=0;for(int j=1;j<=k;j++){if(i&(1<<(j-1))){tmp+=a[j].v;}}ans=max(ans,tmp-dis[bx][by][i]);}return ans;
}
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%s",s[i]+1);for(int j=1;j<=m;j++){if(s[i][j]=='S'){bx=i;by=j;}else if(isdigit(s[i][j])){a[s[i][j]-'0'].x=i;a[s[i][j]-'0'].y=j;k=max(k,s[i][j]-'0');}}}for(int i=1;i<=k;i++){scanf("%d",&a[i].v);}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(s[i][j]=='B'){k++;a[k].x=i;a[k].y=j;a[k].v=-inf>>8;}}}bfs();printf("%d\n",gao());return 0;
}

【CF375C】Circling Round Treasures【XSY1176】大包子环绕宝藏【状压dp】相关推荐

  1. LibreOJ #6177. 「美团 CodeM 初赛 Round B」送外卖2【状压DP】

    「美团 CodeM 初赛 Round B」送外卖2 内存限制:32 MiB 时间限制:200 ms 题目描述 一 张 n 个 点 m 条 有 向 边 的 图 上 , 有 q 个 配 送 需 求 , 需 ...

  2. CF375C Circling Round Treasures(BFS+DP)

    题目 题目传送门\color{red}{题目传送门}题目传送门 输入输出样例 输入样例一 4 4 .... .S1. .... .... 10 输出样例一 2 输入样例二 7 7 ....... .1 ...

  3. Codeforces Round #585 (Div. 2)E. Marbles(状压dp)

    https://codeforces.com/contest/1215/problem/E cnt[x][j]表示把x这种颜色全放到j这种颜色前面所需要的交换次数. 其实这题跟上一篇博客那题是同一个套 ...

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

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

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

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

  6. NOJ 1116 哈罗哈的大披萨 【淡蓝】 [状压dp+各种优化]

    我只能说,珍爱生命,远离卡常数的题...感谢陈老师和蔡神,没有他们,,,我调一个星期都弄不出来,,,, 哈罗哈的大披萨 [淡蓝] 时间限制(普通/Java) : 1000 MS/ 3000 MS   ...

  7. 【CF375C】Circling Round Treasures

    Portal --> CF375C Solution 一个有趣的事情:题目中有很大的篇幅在介绍如何判断一个位置在不在所围的多边形中 那么..给了方法当然就是要用啊 ​ 首先是不能包含\('B'\ ...

  8. Educational Codeforces Round 111 (Rated for Div. 2) E. Stringforces 二分 + 状压dp

    传送门 文章目录 题意: 思路: 题意: 给你一个串,只包含前kkk个字母和???,定义fif_ifi​表示第iii个字母在串中出现的最长连续长度,你现在需要将???替换为前kkk个字母,使得mini ...

  9. Codeforces Round #622 (Div. 2) D. Happy New Year 状压dp

    传送门 文章目录 题意: 思路: 题意: n≤1e5,m≤1e9,k≤8.n\le 1e5,m\le 1e9,k\le 8.n≤1e5,m≤1e9,k≤8. 思路: 注意到题目中保证了每个孩子至多收到 ...

最新文章

  1. 把路由器啥啥从 啥啥写入 NVRAM 的命令是 (53) 。【两道题】【不知道对不对,哈哈】
  2. iptables踩坑记
  3. LC滤波器简单设计法 - 一文读懂LC滤波器简单设计方法及原理介绍,LC值计算方法...
  4. 第8章 SQL语言(一)
  5. 05.Bootstrap导入基础笔记
  6. dva.js 知识导图
  7. slf4j+logback使用
  8. ubuntu下git使用
  9. java 定时器 数据库_java实现定时器,定时修改数据库代码
  10. 程序员需知的 58 个网站
  11. java jmail_JavaMail学习--使用JMail发送邮件
  12. Macbook Pro 安装 win10 单操作系统
  13. 雷课堂(THUnderClass)——清华大学2020C++大作业个人项目记录与总结
  14. dxf制作kml_kml到dxf
  15. PHPAdmin数据类型
  16. HEVC学习-帧内预测-initAdiPattern函数
  17. c语言从键盘输入5阶方阵,输入5×5阶的矩阵,编程实现: (1)求两条对角线上的各元素之和....
  18. Android中从视频中提取音频
  19. Live Mesh Technology Preview
  20. SpringDataJpa系列一之初识及入门案例搭建

热门文章

  1. 程序员必须要掌握的 Git 操作技巧
  2. 『边城』: 陌上花开,可缓缓归矣
  3. Note For Linux By Jes(2)-Linux文件与目录管理
  4. mysql get seq no_mysql的存储怎么写?帮我看看我这个写的哪里有问题?谢谢
  5. 为什么区分LHS和RHS?
  6. 2022情人节最适合送的礼物
  7. 吉林教育杂志吉林教育杂志社吉林教育编辑部2022年第28期目录
  8. c语言程序警告不能打开文件,Win10安装程序提示“不能打开要写入的文件”如何解决...
  9. 利用Grapher Script 重复绘图
  10. Python 阿拉伯数字转换为中文大写数字