Codeforces 1105D Kilani and the Game【BFS】
<题目链接>
题目大意:
每个玩家控制一个颜色去扩张,每个颜色的扩张有自己的速度,一个颜色跑完再跑下一种颜色。在所有颜色不能在继续扩张的时候停止游戏。询问此时各种颜色的数量。
解题分析:
就是用BFS去模拟颜色的扩张,但是需要注意的是,本题需要加一些小的优化,比如,每次只用扩张上一轮BFS新更新的点就行。
#include <bits/stdc++.h>
using namespace std; #define N int(1e3+7)
#define rep(i,s,t) for(int i=s;i<=t;i++)
int n,m,p;
int sp[],prenum[];
char mpa[N][N];bool vis[N][N],go[];
typedef pair<int,int>paii;
vector<paii>vec[];
bool fp,flag;
const int dir[][]={,,,,-,,,-}; struct Node{
int x,y,s;
Node(int _x=,int _y=,int _s=):x(_x),y(_y),s(_s){}
}; void bfs(int u){
queue<Node>q;
for(int i=vec[u].size()-prenum[u];i<vec[u].size();i++){ //将该人上一轮新扩展的点全部push入列,只对这些点展开搜索,节约时间
int fi=vec[u][i].first,se=vec[u][i].second;
vis[fi][se]=true;
q.push(Node(fi,se,));
}
int num=;
while(!q.empty()){
Node now=q.front();q.pop();
int xx=now.x,yy=now.y;
if(now.s==sp[u]){ prenum[u]=num;return; } //如果步数已经走尽
for(int k=;k<;k++){
int nx=xx+dir[k][];
int ny=yy+dir[k][];
if(nx<||nx>n||ny<||ny>m||vis[nx][ny])continue;
else if(mpa[nx][ny]=='.'){ //只有碰到了'.'才能走
mpa[nx][ny]= u +'';
vec[u].push_back(paii(nx,ny)); //标记这一步已经被占领
vis[nx][ny]=true;
flag=true; //有新扩展的点
num++; //记录当前一轮push进去多少个点
q.push(Node(nx,ny,now.s+)); //将这一步push入队列
}
}
}
prenum[u]=num;
} int main(){
scanf("%d%d%d",&n,&m,&p);
rep(i,,p)scanf("%d",&sp[i]);
rep(i,,n){
scanf("%s",mpa[i]+);
rep(j,,m){
if(mpa[i][j]>=''&&mpa[i][j]<=p+''){ //如果碰到数字
vec[mpa[i][j]-''].push_back(paii(i,j)); //将该点坐标记录下
}
}
}
rep(i,,p)prenum[i]=vec[i].size(); //得到一开始各个起点的个数
memset(vis,false,sizeof(vis));
memset(go,true,sizeof(go));
while(true){ //如果有点能够一直扩展,就继续
fp=false;
for(int i=;i<=p;i++){
if(!go[i])continue;
if(go[i])flag=false,bfs(i);
if(!flag)go[i]=false; //如果这个人本轮没有走过,那么标记,下次再轮到他的时候直接跳过
if(flag)fp=true; //判断是否有人能够走
}
if(!fp)break;
}
rep(i,,p){
i==p?printf("%d\n",vec[i].size()):printf("%d ",vec[i].size());
}
}
2019-02-17
Codeforces 1105D Kilani and the Game【BFS】的更多相关文章
- 【bfs】抓住那头牛
[题目] 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0≤N≤100000),牛位于点K(0≤K≤100000).农夫有两种移动方式: 1.从X移动到X-1或X+1,每次 ...
- 【bfs】拯救少林神棍(poj1011)
Description 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位.然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度.请你 ...
- 【bfs】Knight Moves
[题目描述] 输入nn代表有个n×nn×n的棋盘,输入开始位置的坐标和结束位置的坐标,问一个骑士朝棋盘的八个方向走马字步,从开始坐标到结束坐标可以经过多少步. [输入] 首先输入一个nn,表示测试样例 ...
- 【bfs】1252 走迷宫
[题目描述] 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走. 给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到).只能在水平方向或垂直方向走,不 ...
- 【bfs】献给阿尔吉侬的花束
[题目描述] 阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫.今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终点,就在终点放了一块阿尔吉侬最喜欢的奶酪.现在研究员们想 ...
- 【bfs】迷宫问题
[题目描述] 定义一个二维数组: int maze[5][5] = { 0,1,0,0,0, 0,1,0,1,0, 0,0,0,0,0, 0,1,1,1,0, 0,0,0,1,0, }; 它表示一个迷 ...
- 【bfs】仙岛求药
[题目描述] 少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶.叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处.迷阵由M×N个方格组成,有的 ...
- 【bfs】BZOJ1102- [POI2007]山峰和山谷Grz
最后刷个水,睡觉去.Bless All! [题目大意] 给定一个地图,为FGD想要旅行的区域,地图被分为n*n的网格,每个格子(i,j) 的高度w(i,j)是给定的.若两个格子有公共顶点,那么他们就是 ...
- poj3278-Catch That Cow 【bfs】
http://poj.org/problem?id=3278 Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submis ...
随机推荐
- centos7搭建smb服务
1 yum install samba samba-client samba-common -y 安装smb服务 2 cp -a /etc/samba/smb.conf /etc/samba/sm ...
- sleep()和wait()的区别及wait方法的一点注意事项
一.查看API sleep是Thread类的方法,导致此线程暂停执行指定时间,给其他线程执行机会,但是依然保持着监控状态,过了指定时间会自动恢复,调用sleep方法不会释放锁对象. 当调用sleep方 ...
- fatal: refusing to merge unrelated histories
Git 提交代码时遇到冲突了,所以 git pull 拉不下来远程代码.使用一下命令解决: git pull origin master --allow-unrelated-histories 然后解 ...
- Confluence 6 使用主题
主题是被用来修改 Confluence 站点或空间的外观的. Confluence 安装了一个单一的默认主题,或者你也可以下载和安装其他的主题.你可以从 The Atlassian Marketpla ...
- mysql数据库之基本操作和存储引擎
一.知识储备 数据库服务器:一台计算机(对内存要求比较高) 数据库管理系统:如mysql,是一个软件 数据库:oldboy_stu,相当于文件夹 表:student,scholl,class_list ...
- HTML&javaSkcript&CSS&jQuery&ajax-Css
CSS 1 .eg <head> <style> body{ background-color:#d0e4fe;} h1{ color:orange; text-alin:ce ...
- sass基础—具体编译步骤及对应命令:详细
/*基础语法*/h1{ color: red;} /*变量定义*/ $color: red; /*嵌套*/body{ header{ } footer{ }} /*mixin函数*/@mixin al ...
- Python 开发的 IDE 和代码编辑器,你选择的哪一个?
为了方便,我会分两个大类去说明,一类是适用于软件开发的比较通用的编辑器或 IDE ,我们可以通过插件等形式支持 Python 的开发,另一个是专注于 Python 开发的编辑器或 IDE . 不过在此 ...
- 区分TCP包的顺序
确认TCP包的顺序: 使用抓包工具抓包之后,通常按照时间先后排序的,而不是数据的内容逻辑先后.查找内容的先后的关键在于查看TCP中的Sequence number和Acknowledgment num ...
- ID3算法下的决策树
网上的内容感觉又多又乱,自己写一篇决策树算法.希望对别人有所启发,对自己也是一种进步. 决策树 须知概念 信息熵 & 信息增益 熵: 熵(entropy)指的是体系的混乱的程度,在不同的学科中 ...