(CodeForces) D. Kilani and the Game (搜索)
视频讲解戳这里
传送门
题目大意:一个n*m的图,有空格子'.',也有障碍物'#',也有各个玩家的城堡,编号对应着玩家的编号1,2,3.....;每个玩家轮流开始,有他城堡的地方就可以向上下左右扩散,而且分别有一个扩散的速度si,也就是一次可以往外扩散si层,当所有玩家都不能动时,问各个玩家所有的城堡数。
解题思路:思路还是很清晰的,就是每一轮对每一个玩家宽搜一次,每个玩家宽搜si层,往外宽搜一层就是将现在队列里的元素清空一次。题目还有一个坑点就是它的si有1e9的范围,对于这种用max(m,n)代替就行了,不然会T。其他细节剪枝扣扣就行了。代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<stack>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
const int maxn=1e3+5;
int n,m,p,mp[maxn][maxn],sp[15];
struct node {int x;int y;
};
queue<node> q[15];
int allnum=0; //记录已经被占领的格子
int ans[15];
int dx[]= {1,0,0,-1};
int dy[]= {0,1,-1,0};
void pbfs(int np) { //每个玩家的宽搜int prenum=allnum;for(int i=1; i<=sp[np]; ++i) {int msize=q[np].size();prenum=allnum;while(msize) {msize--;node nt=q[np].front();q[np].pop();int nx=nt.x,ny=nt.y;for(int i=0; i<4; ++i) {int tx=nx+dx[i],ty=ny+dy[i];if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&mp[tx][ty]==0) {allnum++;mp[tx][ty]=np;q[np].push(node {tx,ty});ans[np]++;}} }if(prenum==allnum) break;}
}
void bfs() { //控制游戏的轮数if(allnum==n*m) return;int prenum=allnum;for(int i=1; i<=p; ++i) {if(ans[i]) pbfs(i);}if(allnum==prenum) return;bfs();
}
int main() {std::ios::sync_with_stdio(0);cin>>n>>m>>p;int ms=max(n,m);for(int i=1; i<=p; ++i) {cin>>sp[i];sp[i]=min(sp[i],ms);}char tp;for(int i=1; i<=n; ++i) {for(int j=1; j<=m; ++j) {cin>>tp;if(tp=='.') {mp[i][j]=0;continue;}if(tp=='#') {mp[i][j]=-1;allnum++;continue; }int t=tp-'0';mp[i][j]=t;q[t].push(node {i,j});allnum++;ans[t]++;}}bfs();for(int i=1; i<=p; ++i) {cout<<ans[i]<<" ";}return 0;
}
(CodeForces) D. Kilani and the Game (搜索)相关推荐
- Codeforces 698D Limak and Shooting Points (搜索)
题目链接 https://codeforces.com/contest/698/problem/D 题解 玄妙好题啊 对于每个元素\(j\)判断\(j\)是否可被射中.假设我们要用第\(i\)个弓箭射 ...
- CodeForces 540C--自带标记的四方向搜索
题意: 给一个 n 行,m 列的字符矩阵,*表示完整的冰块,X表示断裂的冰块,*踩一下变成X,X踩一下就断裂,之后给出两个确定的点,在 保证冰块不发生断裂的情况下,问能否从一个点走到另一个点,并将到达 ...
- Codeforces 769D k-Интересные пары чисел
题目链接:http://codeforces.com/contest/769/problem/D 搜索题 考虑这些数的值域较小,直接${O(2^{k})}$次方枚举每个数字二进制位上是否改变,剪枝一下 ...
- oracle怎么查日记账,Oracle EBS 导入日记账报错
洛谷P3379 [模板]最近公共祖先(LCA) P3379 [模板]最近公共祖先(LCA) 152通过 532提交 题目提供者HansBug 标签 难度普及+/提高 提交 讨论 题解 最新讨论 为 ...
- Codeforces 900D Unusual Sequences:记忆化搜索
题目链接:http://codeforces.com/problemset/problem/900/D 题意: 给定x,y,问你有多少个数列a满足gcd(a[i]) = x 且 ∑(a[i]) = y ...
- Codeforces Round #297 (Div. 2)E. Anya and Cubes 折半搜索
Codeforces Round #297 (Div. 2)E. Anya and Cubes Time Limit: 2 Sec Memory Limit: 512 MB Submit: xxx ...
- Codeforces Round #336 (Div. 2) D. Zuma 记忆化搜索
D. Zuma 题目连接: http://www.codeforces.com/contest/608/problem/D Description Genos recently installed t ...
- Codeforces Round #359 (Div. 2) C. Robbers' watch 搜索
题目链接:http://codeforces.com/contest/686/problem/C 题目大意: 给你两个十进制的数n和m,选一个范围在[0,n)的整数a,选一个范围在[0,m)的整数b, ...
- Educational Codeforces Round 76 (Rated for Div. 2) F. Make Them Similar 折半搜索
传送门 文章目录 题意: 思路: 题意: 思路: 一个显然的思路就是2302^{30}230枚举所有的xxx,让后再检查,这个复杂度显然不能接受. 又发现对于每个位置它取多少不受其他位置限制,满足可拼 ...
最新文章
- 微信小程序把繁琐的判断用Js简单的解决
- 华为p40鸿蒙系统价格有好高,鸿蒙系统版本华为P50新机的曝光,华为P40处境悲惨价格骤降...
- 机器学习 深度学习 ai_人工智能,机器学习,深度学习-特征和差异
- JAR——pinyin4j-2.5.0
- html代码在线分析,网站html代码解析
- Python快速判断若干整数是否互不相同
- 基于Windows Server 2019域环境体验Veeam ONE 10安装
- 卫生间防水应注意哪些问题?
- 【转载】深入浅出VA函数
- Listary的使用
- Materialise Mimics Innovation Suite Research 19.0 X64安装包原版
- CentOS7 部署 RAID 磁盘阵列
- 电脑计算机无法找到脚本文件夹,电脑开机老是提醒无法找到脚本文件的处理方法...
- MATLAB无约束优化(UOM)
- 【安全牛学习笔记】扫描工具-Nikto
- 2022京东年货节全民炸年兽玩法攻略
- 体系结构 | 五段流水线 | 流水线技术
- 用Python爬取微博热搜数据
- 图片打不开怎么办?只需这样操作
- 计算机网络及相关设备的维护,网络设备管理与维护--详细介绍
热门文章
- 学渣的刷题之旅 leetcode刷题 3. 无重复字符的最长子串(暴力法、滑动窗口)
- MFC中listctrl图片拖拽效果
- 家用双wan口路由器推荐_教你如何配置双WAN口路由器
- RFID牛只识别系统c语言编程,种牛RFID管理系统解决方案
- 垃圾分类游戏HTML,垃圾分类宣传进村居,趣味游戏中学分类
- java面试题之-Redis篇(持续更新)
- 扣丁软件测试基础知识,苹果无线充电线圈揭秘,iphone8无线充电线圈介绍
- ElementUI表格中显示图片,悬浮显示放大图片
- Windows系统重装系统和激活
- php扩展库后门,编写基于PHP扩展库的后门