https://codeforces.com/contest/1105/problem/D

C++版本一

题解:

双DFS

先枚举可以走的点

再从这个点出发,DFS在范围si内可以走所有点

/*
*@Author:   STZG
*@Language: C++
*/
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
//#define DEBUG
#define RI register int
using namespace std;
typedef long long ll;
//typedef __int128 lll;
const int N=1000+10;
const int MOD=1e9+7;
const double PI = acos(-1.0);
const double EXP = 1E-8;
const int INF = 0x3f3f3f3f;
int t,n,m,k;
int ans[N],cnt,flag,temp,p;
int a[N];
int vis[N][N];
int b[4][2]={1,0,0,1,-1,0,0,-1};
char str[N][N];
struct node{int x,y;int v,id;
}x,f,F,tmp,e[N*N];
queue <node>q;
void bfs(node d){queue<node>Q;Q.push(d);while(!Q.empty()){F=Q.front();Q.pop();if(F.v<=0){F.v=d.v;q.push(F);continue;}for(int i=0;i<4;i++){tmp=F;tmp.x+=b[i][0];tmp.y+=b[i][1];tmp.v--;if(tmp.x<1||tmp.y<1||tmp.x>n||tmp.y>m){continue;}if(str[tmp.x][tmp.y]=='#'){continue;}if(vis[tmp.x][tmp.y]!=0){continue;}//cout<<F.id<<" "<<tmp.x<<" "<<tmp.y<<" "<<tmp.v<<endl;vis[tmp.x][tmp.y]=F.id;ans[F.id]++;Q.push(tmp);}}
}
bool cmp(node a,node b){return a.id<b.id;
}
int main()
{
#ifdef DEBUGfreopen("input5.in", "r", stdin);//freopen("output.out", "w", stdout);
#endifscanf("%d%d%d",&n,&m,&p);//scanf("%d",&t);//while(t--){}for(int i=1;i<=p;i++){scanf("%d",&a[i]);}for(int i=1;i<=n;i++){scanf("%s",str[i]+1);for(int j=1;j<=m;j++){if(isdigit(str[i][j])){x.x=i;x.y=j;x.v=a[str[i][j]-'0'];vis[i][j]=1;x.id=str[i][j]-'0';ans[str[i][j]-'0']++;e[++cnt]=x;//cout<<cnt<<endl;}}}sort(e+1,e+cnt+1,cmp);for(int i=1;i<=cnt;i++){q.push(e[i]);}while(!q.empty()){f=q.front();//cout<<f.id<<endl;q.pop();flag=0;for(int i=0;i<4;i++){tmp=f;tmp.x+=b[i][0];tmp.y+=b[i][1];if(tmp.x<1||tmp.y<1||tmp.x>n||tmp.y>m){continue;}if(str[tmp.x][tmp.y]=='#'){continue;}if(vis[tmp.x][tmp.y]!=0){continue;}//cout<<flag<<" "<<f.id<<" "<<tmp.x<<" "<<tmp.y<<endl;flag=1;break;}if(flag)bfs(f);}for(int i=1;i<=p;i++){printf("%d ",ans[i]);}//cout << "Hello world!" << endl;return 0;
}

C++版本二

#include <bits/stdc++.h>
#define lld I64d
#define mp make_pair
using namespace std ;
/*
inline long long Readin() {long long K = 0 , F = 1 ; char C = ' ' ;while( C < '0' or C > '9' ) F = C == '-' ? -1 : 1 , C = getchar() ;while( C <= '9' and C >= '0' ) K = ( K << 1 ) + ( K << 3 ) + C - '0' , C = getchar() ;return F * K ;
}
*/
inline int Readin() {int K = 0 ; char C = ' ' ;while( C < '0' or C > '9' ) C = getchar() ;while( C <= '9' and C >= '0' ) K = ( K << 1 ) + ( K << 3 ) + C - '0' , C = getchar() ;return K ;
}
const int MaxN = 1005 ;
const int x[5] = {0,1,0,0,-1};
const int y[5] =               {1,0,1,-1,0};
int N , M , P ;
int Empty , La = 1000000 ;
bool Vis[MaxN][MaxN] ;
int Ans[10] ;
queue< pair<int,int> > Q[10] ;
int S[10] ;
int main() {scanf( "%d%d%d" , &N , &M , &P ) ;for(register int i = 1 ; i <= P ; ++i ) scanf( "%d" , &S[i] ) ;getchar();for(register int i = 1 ; i <= N ; ++i ) {for(register int j = 1 ; j <= M ; ++j ) {register char C = getchar() ;switch( C ) {case '.' : {Vis[i][j] = true ;++Empty ;break;}case '#' : {break;}default : {register int Pl = C - '0' ;++Ans[Pl] ;Q[Pl].push( mp( i , j ));break;}}}getchar() ;//}cout<<"get";
}while( La != Empty ) {La= Empty+1;                                                                     --La;for(register int i = 1 ; i <= P ; ++i ) {for(register int Ss = 1 ; Ss <= S[i] and 0<Q[i].size() ; ++Ss){register int End = Q[i].size() ;while( End-- ) {register int Hang = Q[i].front().first;register int Lie = Q[i].front().second;Q[i].pop();for(register int ii = 0 ; ++ii < 5 ; ) {int th = Hang + x[ii] ,tl=Lie+y[ii];if(th<1 or tl<1 or th>N or tl > M or false and true)continue;if( Vis[th][tl] ) {                                                                       --Empty;++Ans[i] ;Q[i].push(mp(th,tl)  ) ;Vis[th][tl] = not true ;}}}}}}for(register int i = 0 ; ++i <= P ; printf( "%d " , Ans[i]))               ;return not printf( "\n") ;
}

C++版本三

#include <bits/stdc++.h>
using namespace std;const int dr[] = {1,-1,0,0};
const int dc[] = {0,0,1,-1};
const int maxn = 1000+5;
typedef pair<int,int> pii;
int n,m,p,s[maxn];
int mp[maxn][maxn];
int ans[15];
vector<pii> v[15];bool bfs(int x) {vector<pii> que;int tz = v[x].size();que.resize(tz);for(int i = 0; i < v[x].size(); ++i) {que[i] = v[x][i];}v[x].clear();for(int i = 0; i < que.size(); ++i) {for(int j = 0; j < 4; ++j) {pii u = que[i];int nx = u.first+dr[j], ny = u.second+dc[j];// cout << nx <<" " << ny << endl;if(nx < 0 || nx >= n || ny < 0 || ny >= m || mp[nx][ny] != 0)continue;mp[nx][ny] = x;ans[x]++;v[x].push_back(pii(nx,ny));}}if(v[x].size() == 0)return 0;return 1;
}void print() {for(int i = 1; i <= p; ++i) {cout << ans[i] <<" ";}
}
int main() {scanf("%d%d%d", &n, &m, &p);for(int i = 1; i <= p; ++i)scanf("%d", &s[i]);for(int i = 0; i < n; ++i) {for(int j = 0; j < m; ++j){char ch;scanf(" %c", &ch);if(ch == '.')mp[i][j] = 0;else if(ch == '#')mp[i][j] = -1;else {mp[i][j] = ch-'0';v[mp[i][j]].push_back(pii(i,j));ans[mp[i][j]]++;}}}while(1){bool flag = false;for(int i = 1; i <= p; ++i) {for(int j = 0; j < s[i]; ++j) {bool flag2 = bfs(i);flag |= flag2;if(flag2 == false)break;}}if(flag == false)break;} for(int i = 0; i < n; ++i,cout<<endl)for(int j = 0; j < m; ++j) {cout << mp[i][j];}print();return 0;
}

Kilani and the Game相关推荐

  1. (CodeForces) D. Kilani and the Game (搜索)

    视频讲解戳这里 传送门 题目大意:一个n*m的图,有空格子'.',也有障碍物'#',也有各个玩家的城堡,编号对应着玩家的编号1,2,3.....;每个玩家轮流开始,有他城堡的地方就可以向上下左右扩散, ...

  2. Codeforces Round #533 (Div. 2) D. Kilani and the Game

    题意:给你n,m,p分别代表矩阵的为n*m,p个起点,每个起点的向四周扩散的速度为si 问最后每个起点可以占领多少个格子. 思路:很显然这是一个类bfs,但是有多个起点,而且规定了一次每个点只能走si ...

  3. python 正则表达式提取数据_Python爬虫教程-19-数据提取-正则表达式(re)

    本篇主页内容:match的基本使用,search的基本使用,findall,finditer的基本使用,匹配中文,贪婪与非贪婪模式 Python爬虫教程-19-数据提取-正则表达式(re) 正则表达式 ...

  4. Codeforces Round #533 (Div. 2) C.思维dp D. 多源BFS

    题目链接:https://codeforces.com/contest/1105 C. Ayoub and Lost Array 题目大意:一个长度为n的数组,数组的元素都在[L,R]之间,并且数组全 ...

  5. 免疫治疗之非小细胞肺癌 | MedChemExpress

    肺癌是最常见的恶性肿瘤之一,其发病率和死亡率在全球所有癌症类型中居首位,其中,85% 以上为非小细胞肺癌 (NSCLC).在过去发展中,对 NSCLC 的治疗模式发生了重大改变: 这主要是因为有生物标 ...

  6. ArabellaCPC 2019 B. Road to Arabella

    题目 这个题题意弄明白就会了,也就是对手有一个正整数n,你有一个正整数k<=n,每一次都能对n执行n-=x,(1≤x≤max(1,m−k));把0摆在对方面前就是赢了. 如此我们很容易想起奇偶性 ...

  7. Gym - 102263 B - Road to Arabella

    原题内容 Ayoub and Kilani felt board while they are going to ArabellaCPC in (Amman-Irbid) road, so Kilan ...

  8. 【补题计划】Codeforces Round #533+#534(Div.2)

    #533 D. Kilani and the Game 模拟一个游戏,每轮每个玩家可以把距离他拥有的领地的ki步内的格子占领,不能跨越别人的领地以及障碍,问最终每个人占领多少个格子. 写了好几种写法, ...

  9. mysql_select_db不到数据库问题

    mysql_select_db不到数据库问题 $conn = mysql_connect('127.0.0.1', 'es_pandakorea', '***') or die("数据库链接 ...

最新文章

  1. 和老同事的谈话:关于职业生涯以及MDA
  2. 大型网站技术架构(八)网站的安全架构
  3. 《小印记》源码分享--极光推送服务器篇
  4. Linux系统日志分析与管理(14)
  5. 统一处理jquery ajax请求过程中的异常错误信息的机制
  6. 安装memcached服务 和 php 安装memcache扩展
  7. 收集6 款 Java 8 自带工具,轻松分析定位 JVM 性能问题!
  8. QT 多屏参数获取和设置
  9. PHP--字符串处理函数
  10. Hadoop HIVE 条件控制函数
  11. Tcpdump的详细用法
  12. Ubuntu下添加打印机---之寻找设备lpinfo
  13. mysql 组复制和传统复制_2017年12月聚合文章--MySQL 传统复制中常见故障处理和结构优化案例分析 | 码友网...
  14. Java多线程系列--“JUC集合”
  15. Command(命令)
  16. Windows xp 驱动EPSON MT532打印小票始末
  17. java堆栈队列api
  18. 2017年节假日放假安排来了!
  19. Invalid bound statement (not found)出现的原因和解决方法
  20. 计算机一级win7win10,一招win7免费升级成win10系统的简单方法(图文)

热门文章

  1. 该线程或进程自上一个步骤以来已更改_多线程与高并发
  2. 怎么把两个盒子显示在同一行_1个机顶盒2台电视机,怎么同时看电视?竟用一个分配器就行...
  3. mysql自连接查询去重_MySQL命令汇总
  4. ajax form表单提交_LayUI提交表单,监听select,分页组件
  5. oracle 存储 更新,oracle 更新空间数据存储过程语句
  6. 学习型php空间,补装修日记:学习型业主三大要素
  7. vs html自动对齐,vscode esLint 保存时 自动对齐
  8. mysql b-a全局索引_MySQL中B+树索引的使用
  9. apache 编译支持php_apache2 不支持php文件 解决办法(示例代码)
  10. mysql的内存数据库,MySQL内存数据库的新选择-MariaDB4J