Codeforces 1105D Kilani and the Game【BFS】

<题目链接>

题目大意:

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

解题分析:

就是用BFS去模拟颜色的扩张,但是需要注意的是,本题需要加一些小的优化,比如,每次只用扩张上一轮BFS新更新的点就行。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 #define N int(1e3+7)
 5 #define rep(i,s,t) for(int i=s;i<=t;i++)
 6 int n,m,p;
 7 int sp[15],prenum[15];
 8 char mpa[N][N];bool vis[N][N],go[15];
 9 typedef pair<int,int>paii;
10 vector<paii>vec[15];
11 bool fp,flag;
12 const int dir[][2]={1,0,0,1,-1,0,0,-1};
13
14 struct Node{
15     int x,y,s;
16     Node(int _x=0,int _y=0,int _s=0):x(_x),y(_y),s(_s){}
17 };
18
19 void bfs(int u){
20     queue<Node>q;
21     for(int i=vec[u].size()-prenum[u];i<vec[u].size();i++){    //将该人上一轮新扩展的点全部push入列,只对这些点展开搜索,节约时间
22         int fi=vec[u][i].first,se=vec[u][i].second;
23         vis[fi][se]=true;
24         q.push(Node(fi,se,0));
25     }
26     int num=0;
27     while(!q.empty()){
28         Node now=q.front();q.pop();
29         int xx=now.x,yy=now.y;
30         if(now.s==sp[u]){ prenum[u]=num;return; }   //如果步数已经走尽
31         for(int k=0;k<4;k++){
32             int nx=xx+dir[k][0];
33             int ny=yy+dir[k][1];
34             if(nx<1||nx>n||ny<1||ny>m||vis[nx][ny])continue;
35             else if(mpa[nx][ny]==‘.‘){      //只有碰到了‘.‘才能走
36                 mpa[nx][ny]= u +‘0‘;
37                 vec[u].push_back(paii(nx,ny));     //标记这一步已经被占领
38                 vis[nx][ny]=true;
39                 flag=true;     //有新扩展的点
40                 num++;         //记录当前一轮push进去多少个点
41                 q.push(Node(nx,ny,now.s+1));    //将这一步push入队列
42             }
43         }
44     }
45     prenum[u]=num;
46 }
47
48 int main(){
49     scanf("%d%d%d",&n,&m,&p);
50     rep(i,1,p)scanf("%d",&sp[i]);
51     rep(i,1,n){
52         scanf("%s",mpa[i]+1);
53         rep(j,1,m){
54             if(mpa[i][j]>=‘1‘&&mpa[i][j]<=p+‘0‘){        //如果碰到数字
55                 vec[mpa[i][j]-‘0‘].push_back(paii(i,j));      //将该点坐标记录下
56             }
57         }
58     }
59     rep(i,1,p)prenum[i]=vec[i].size();    //得到一开始各个起点的个数
60     memset(vis,false,sizeof(vis));
61     memset(go,true,sizeof(go));
62     while(true){        //如果有点能够一直扩展,就继续
63         fp=false;
64         for(int i=1;i<=p;i++){
65             if(!go[i])continue;
66             if(go[i])flag=false,bfs(i);
67             if(!flag)go[i]=false;      //如果这个人本轮没有走过,那么标记,下次再轮到他的时候直接跳过
68             if(flag)fp=true;     //判断是否有人能够走
69         }
70         if(!fp)break;
71     }
72     rep(i,1,p){
73         i==p?printf("%d\n",vec[i].size()):printf("%d ",vec[i].size());
74     }
75 }

2019-02-17

原文地址:https://www.cnblogs.com/00isok/p/10392291.html

时间: 2024-10-08 11:00:22

Codeforces 1105D Kilani and the Game【BFS】的相关文章

【bfs】【中等难度】tyvj P1234 - bench与奔驰

P1234 - bench与奔驰 From zhangbh001    Normal (OI) 总时限:10s    内存限制:128MB    代码长度 限制:64KB P1234 - bench与奔驰 背景 Background 公园里有个人在练开奔驰 - -!,但是总是撞在bench上 (众人曰:狼来了,快跑啊!) 描述 Description 公园里的bench与奔驰都是无敌的,不会被撞坏.由于开奔驰的人比较"有特点",总是向上下左右四个方向开,而且只会在撞到椅子之后改变方向(

hdoj 1312 Red and Black 【BFS】

题意:一共有四个方向,从'@'出发,找能到达'.'的个数, #是不能通过的. 策略:广搜. 这道题属于最简单的bfs了. 代码: #include<stdio.h> #include<string.h> #include<queue> using std::queue; bool vis[25][25]; char s[25][25]; int n, m; int ans = 0; struct node{ int x, y; }; node st; const int

HDU1242 Rescue 【BFS】

Rescue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 16314    Accepted Submission(s): 5926 Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is

HDU 1253 胜利大逃亡 NYOJ 523【BFS】

胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 24608    Accepted Submission(s): 9427 Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的

NYOJ 284 坦克大战 【BFS】+【优先队列】

坦克大战 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 Many of us had played the game "Battle city" in our childhood, and some people (like me) even often play it on computer now. What we are discussing is a simple edition of this game. Given a map that co

【BFS】uva10047The Monocycle

/* 本题的特殊之处,到达一个格子时,因为朝向不同,以及接触地面的颜色不同, 会处于不同的状态::::::::: 把(x, y, d, c)作为一个结点,表示所在位置(x, y),方向为d,颜色为c;;;;; ------------------------------------------------------------------------ 在方向上我们把前,左,右编号为0,1,2:::: 颜色,从蓝色开始编号为0,1,2,3:::::::::: ------------------

【BFS】uva11624Fire!

/* bfs宽度遍历 -------------------------------------------------------------------------- 对人和火同时进行bfs,,注意应该先火后人,即如果在人到达该格子前,格子已经着火 则不应该走,最后人走到边界无路可走,则IMPOSSIBLE!!!!!!!!!!!! --------------------------------------------------------------------------- 两次bfs

【bfs】hdu 1104 Remainder

[bfs]hdu 1104 Remainder 题目链接:hdu 1104 Remainder 很不错的一道搜索题目,但是有几个关键问题要注意. 最短路径,果断bfs+Queue 路径的存储问题,之前只想把每一步的计算结果存储到queue(int)Q中,后来发现路径无法记录,就选择存储节点的方式并用string保存路径,queue(node)Q,开一个临时的节点node p,每进行一次运算就更新它的路径string+'op',最终输出的一定是完整路径!! 但最关键的是取模!!!!! discus

Poj 3087 Shuffle&#39;m Up 【BFS】

Shuffle'm Up Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6556 Accepted: 3077 Description A common pastime for poker players at a poker table is to shuffle stacks of chips. Shuffling chips is performed by starting with two stacks of pok