<题目链接>

题目大意:

每个玩家控制一个颜色去扩张,每个颜色的扩张有自己的速度,一个颜色跑完再跑下一种颜色。在所有颜色不能在继续扩张的时候停止游戏。询问此时各种颜色的数量。

解题分析:

就是用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】的更多相关文章

  1. 【bfs】抓住那头牛

    [题目] 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0≤N≤100000),牛位于点K(0≤K≤100000).农夫有两种移动方式: 1.从X移动到X-1或X+1,每次 ...

  2. 【bfs】拯救少林神棍(poj1011)

    Description 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位.然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度.请你 ...

  3. 【bfs】Knight Moves

    [题目描述] 输入nn代表有个n×nn×n的棋盘,输入开始位置的坐标和结束位置的坐标,问一个骑士朝棋盘的八个方向走马字步,从开始坐标到结束坐标可以经过多少步. [输入] 首先输入一个nn,表示测试样例 ...

  4. 【bfs】1252 走迷宫

    [题目描述] 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走. 给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到).只能在水平方向或垂直方向走,不 ...

  5. 【bfs】献给阿尔吉侬的花束

    [题目描述] 阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫.今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终点,就在终点放了一块阿尔吉侬最喜欢的奶酪.现在研究员们想 ...

  6. 【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, }; 它表示一个迷 ...

  7. 【bfs】仙岛求药

    [题目描述] 少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶.叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处.迷阵由M×N个方格组成,有的 ...

  8. 【bfs】BZOJ1102- [POI2007]山峰和山谷Grz

    最后刷个水,睡觉去.Bless All! [题目大意] 给定一个地图,为FGD想要旅行的区域,地图被分为n*n的网格,每个格子(i,j) 的高度w(i,j)是给定的.若两个格子有公共顶点,那么他们就是 ...

  9. poj3278-Catch That Cow 【bfs】

    http://poj.org/problem?id=3278 Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submis ...

随机推荐

  1. 使用应用链接来连接 Jira 和 Confluence 6

    请参考 Linking to Another Application 页面中的内容来设置如何让 Confluence 连接到你的 Jira 应用,这个过程只需要一次就可以了. 如果你计划使用 Jira ...

  2. Confluence 6 修改特定的空间标识图片

    空间管理员可以为他们管理的空间修改空间标识图片.这个修改将会覆盖默认的空间标识图片,任何对默认空间图标表示的修改将不会对已经修改的空间标识图片产生影响.请查看上面的例子中的 'Sample Space ...

  3. Vue2.0 新手完全填坑攻略—从环境搭建到发布

    http://www.open-open.com/lib/view/open1476240930270.html https://jingyan.baidu.com/article/91f5db1b2 ...

  4. selenium怎么操作web页面常见的元素

    总结一下selenium怎么操作web页面常见的元素. 主要有: 上传 alter dialog prompt dialog confirm dialog select list radio box ...

  5. django模板导入外部js和css等文件

    1.新建文件夹templates(存放模板文件),新建文件夹media(存放js.css.images文件夹),并把两个文件夹放到了项目的根目录下 2.设定模板路径 设置模板路径比较简单,只要在set ...

  6. SpringBoot事务管理

    1.在UserMapper接口中添加更新和删除方法 package com.cppdy.mapper; import org.apache.ibatis.annotations.Delete; imp ...

  7. sort方法实际应用详解---javascript中对一个对象数组按照对象某个属性进行排序

    转载: 查看原文 在javascript中,对象和数组是两种不同的类型,这和php中的数组概念不同.在javascript中,也有一些精妙的算法,用来对一些对象进行排序.我在面试迅雷的时候,也拿到一道 ...

  8. idea导入java项目

    https://blog.csdn.net/m0_37106742/article/details/70154244 ( 主要 )https://blog.csdn.net/u012099869/ar ...

  9. Mac下Java JDK的下载安装和配置

    一.下载安装 打开一个搜索引擎,输入JDK,找到Java JDK 如图:  点击打开,同意协议开始下载如图: 下载好以后,安装即可. 安装成功以后,进入根目录,可以找到JDK安装的位置: 资源库——& ...

  10. Fiddler导出Jmeter脚本

    版本:V4.4 用途:将fiddler抓取的请求,导出为jmx格式,方便jmeter直接调用 新增功能: 1.在测试计划下,新增[HTTP请求默认值],内容为空,后续需将站点的IP和端口填下在这个下面 ...