<题目链接>

题目大意:

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

解题分析:

就是用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. 洛谷P2014 选课

    首先分析题目,这是一道树形dp的题目,是树形背包类的问题,以为每门课的先修课只有一门,所以这一定可以 构成一个森林结构,于是我们可以设计一个虚拟的根节点作为森林的根. 状态转移方程如下 dp[v][k ...

  2. 用ngif 多次判断 Expression has changed after it was checked

    昨天遇到一个问题 ,用ng Expression has changed after it was checked 查了一下说在angular2中,这个错误只会在dev开发模式下出现,在pro发布版本 ...

  3. Netty多人聊天室

    在简单聊天室的代码中修改ChatServerHandler类,就可以模拟多人聊天的功能 package com.cppdy.server; import io.netty.channel.Channe ...

  4. Jmeter 传值对比

    ${XXX}----------------------->在同一线程内可任务调用变量: vars.put(row,rowNum); ----------------------->var ...

  5. windows 7 下用git

    参考:http://my.oschina.net/longxuu/blog/141699

  6. 使用Java及相关内容的目标

    培养设计高性能并发服务器架构能力. 基于高性能并发,创新应用和服务.

  7. 集腋成裘-01 sublime常用的快捷键

    sublime使用的快捷键 1:Html 结构代码  : Html:xt + tab键 2:补全标签代码   : tab键 3:快速复制一行代码 : Ctrl+shift+d 4:快速选中一行代码 : ...

  8. Deap thinking

    它使任何人离任何问题的答案间的距离变得只有点击一下鼠标这么远! ---------<美国周刊> ---------周志华<机器学习>   所以我们更应该学会Deep Think ...

  9. Oracle数据重复,只取一条

    --方法一 select * from tb_supply where rowid=any(select max(rowid) from tb_supply group by phone_id) -- ...

  10. 设置git记住用户和密码

     git config --global credential.helper store