视频讲解戳这里

传送门

题目大意:一个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 (搜索)相关推荐

  1. Codeforces 698D Limak and Shooting Points (搜索)

    题目链接 https://codeforces.com/contest/698/problem/D 题解 玄妙好题啊 对于每个元素\(j\)判断\(j\)是否可被射中.假设我们要用第\(i\)个弓箭射 ...

  2. CodeForces 540C--自带标记的四方向搜索

    题意: 给一个 n 行,m 列的字符矩阵,*表示完整的冰块,X表示断裂的冰块,*踩一下变成X,X踩一下就断裂,之后给出两个确定的点,在 保证冰块不发生断裂的情况下,问能否从一个点走到另一个点,并将到达 ...

  3. Codeforces 769D k-Интересные пары чисел

    题目链接:http://codeforces.com/contest/769/problem/D 搜索题 考虑这些数的值域较小,直接${O(2^{k})}$次方枚举每个数字二进制位上是否改变,剪枝一下 ...

  4. oracle怎么查日记账,Oracle EBS 导入日记账报错

    洛谷P3379 [模板]最近公共祖先(LCA) P3379 [模板]最近公共祖先(LCA) 152通过 532提交 题目提供者HansBug 标签 难度普及+/提高 提交  讨论  题解 最新讨论 为 ...

  5. Codeforces 900D Unusual Sequences:记忆化搜索

    题目链接:http://codeforces.com/problemset/problem/900/D 题意: 给定x,y,问你有多少个数列a满足gcd(a[i]) = x 且 ∑(a[i]) = y ...

  6. 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  ...

  7. Codeforces Round #336 (Div. 2) D. Zuma 记忆化搜索

    D. Zuma 题目连接: http://www.codeforces.com/contest/608/problem/D Description Genos recently installed t ...

  8. Codeforces Round #359 (Div. 2) C. Robbers' watch 搜索

    题目链接:http://codeforces.com/contest/686/problem/C 题目大意: 给你两个十进制的数n和m,选一个范围在[0,n)的整数a,选一个范围在[0,m)的整数b, ...

  9. Educational Codeforces Round 76 (Rated for Div. 2) F. Make Them Similar 折半搜索

    传送门 文章目录 题意: 思路: 题意: 思路: 一个显然的思路就是2302^{30}230枚举所有的xxx,让后再检查,这个复杂度显然不能接受. 又发现对于每个位置它取多少不受其他位置限制,满足可拼 ...

最新文章

  1. 微信小程序把繁琐的判断用Js简单的解决
  2. 华为p40鸿蒙系统价格有好高,鸿蒙系统版本华为P50新机的曝光,华为P40处境悲惨价格骤降...
  3. 机器学习 深度学习 ai_人工智能,机器学习,深度学习-特征和差异
  4. JAR——pinyin4j-2.5.0
  5. html代码在线分析,网站html代码解析
  6. Python快速判断若干整数是否互不相同
  7. 基于Windows Server 2019域环境体验Veeam ONE 10安装
  8. 卫生间防水应注意哪些问题?
  9. 【转载】深入浅出VA函数
  10. Listary的使用
  11. Materialise Mimics Innovation Suite Research 19.0 X64安装包原版
  12. CentOS7 部署 RAID 磁盘阵列
  13. 电脑计算机无法找到脚本文件夹,电脑开机老是提醒无法找到脚本文件的处理方法...
  14. MATLAB无约束优化(UOM)
  15. 【安全牛学习笔记】扫描工具-Nikto
  16. 2022京东年货节全民炸年兽玩法攻略
  17. 体系结构 | 五段流水线 | 流水线技术
  18. 用Python爬取微博热搜数据
  19. 图片打不开怎么办?只需这样操作
  20. 计算机网络及相关设备的维护,网络设备管理与维护--详细介绍

热门文章

  1. 学渣的刷题之旅 leetcode刷题 3. 无重复字符的最长子串(暴力法、滑动窗口)
  2. MFC中listctrl图片拖拽效果
  3. 家用双wan口路由器推荐_教你如何配置双WAN口路由器
  4. RFID牛只识别系统c语言编程,种牛RFID管理系统解决方案
  5. 垃圾分类游戏HTML,垃圾分类宣传进村居,趣味游戏中学分类
  6. java面试题之-Redis篇(持续更新)
  7. 扣丁软件测试基础知识,苹果无线充电线圈揭秘,iphone8无线充电线圈介绍
  8. ElementUI表格中显示图片,悬浮显示放大图片
  9. Windows系统重装系统和激活
  10. php扩展库后门,编写基于PHP扩展库的后门