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 ...
随机推荐
- 2018 github热门项目
github流行的几个项目,我们来学习一下. 1. developer-roadmap-chinese image.png 项目简介:2018年web程序员路线中文版, 这个仓库里包含了一些前端,后端 ...
- vue-cli3初尝试之路径别名配置
let path = require('path') function resolve(dir) { return path.join(__dirname, dir) } module.exports ...
- python并发编程之多线程1
一多线程的概念介绍 threading模块介绍 threading模块和multiprocessing模块在使用层面,有很大的相似性. 二.开启多线程的两种方式 1.创建线程的开销比创建进程的开销小, ...
- hashlib、logging模块
hashlib模块 hashlib提供了常见的摘要算法,如md5和sha1等等. 那么什么是摘要算法呢?摘要算法又称为哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通 ...
- C#关于线程的问题
1.通过System.threading.Thread类可以创建新的线程,并在线程堆栈中运行静态和动态的实例,可以通过Thread类的构造方法传递一个无参数,并且不返回的委托, class Progr ...
- Best Free Hacking E-Books 2017 In PDF Format
1.Best Free Hacking E-Books 2017 In PDF Format: 电子书籍下载地址 后续我会更新在我的百度云资源 上,需要的留言Black Belt Hacking &a ...
- django----基于Form组件实现的增删改和基于ModelForm实现的增删改
一.ModelForm的介绍 ModelForm a. class Meta: model, # 对应Model的 fields=None, # 字段 exclude=None, # 排除字段 lab ...
- cf1114D 区间dp基础
最简单的那类区间dp,昨天晚上心态不对,不知道在打什么.. /* dp[l][r]表示区间[l,r]都涂成同色的代价 dp[l][r]可以由dp[l][r-1],dp[l+1][r],dp[l+1][ ...
- Centos7上vsftp脚本--> sh vsftp.sh 用户名 密码 --> sh vsftp.sh install
#!/bin/bash #vsftp install . /etc/rc.d/init.d/functions users=/etc/vsftpd/vftpuser.txt login=/etc/vs ...
- go的gin框架从请求中获取参数的方法
前言: go语言的gin框架go里面比较好的一个web框架, github的start数超过了18000.可见此框架的可信度 如何获取请求中的参数 假如有这么一个请求: POST /post/te ...