Codeforces Round #533(Div. 2) D.Kilani and the Game
链接:https://codeforces.com/contest/1105/problem/D
题意:
给n*m的地图,最多9个人,同时有每个人的扩张次数(我开始以为是直线扩张最大长度。。实际是能连续扩张次数。)
地图上有‘#’,‘.',和数字,数字对应每个人的据点,
从1-n轮流扩张。
地图被扩张完后,输入每个人的据点数目。
思路:
赛后写的题。还一堆bug,
用队列和一个数组,记录每个人能扩张的点和下一次能扩张的个数。
然后就是一堆循环套着。每次入队更新下一次的扩张个数,同时用flag记录有几个人还可以扩张。
不能扩张就减一。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | #include <bits/stdc++.h> using namespace std; const int MAXN = 1010; struct Node { int _x; int _y; Node( int x, int y):_x(x),_y(y){} }; int Next[4][2] = {{-1,0},{0,1},{1,0},{0,-1}}; int next_time[10]; int Map[MAXN][MAXN]; int number[10]; int speed[10]; int vis[10]; queue<Node> player[10]; int main() { int n, m, p; char c; scanf ( "%d%d%d" , &n, &m, &p); for ( int i = 1; i <= p; i++) { scanf ( "%d" , &speed[i]); } for ( int i = 1; i <= n; i++) { for ( int j = 1; j <= m; j++) { cin >> c; if (c == '.' ) Map[i][j] = 0; else if (c == '#' ) Map[i][j] = -1; else { Map[i][j] = c - '0' ; player[c - '0' ].push(Node(i, j)); number[c - '0' ]++; next_time[c - '0' ]++; } } } int flag = p; while (flag > 0) { for ( int i = 1; i <= p; i++) { if (player[i].empty()) continue ; for ( int times = 1; times <= speed[i]; times++) { int ti = next_time[i]; next_time[i] = 0; for ( int z = 1; z <= ti; z++) { //cout << 2 << endl; int x = player[i].front()._x; int y = player[i].front()._y; player[i].pop(); for ( int j = 0; j < 4; j++) { int tx = x + Next[j][0]; int ty = y + Next[j][1]; if (tx < 1 || tx > n || ty < 1 || ty > m) continue ; if (Map[tx][ty] != 0 || Map[tx][ty] == '#' ) continue ; Map[tx][ty] = i; number[i]++; player[i].push(Node(tx, ty)); next_time[i]++; } } if (player[i].empty()&&vis[i] == 0) { flag--; vis[i] = 1; break ; } /* for (int v = 1;v<=n;v++) { for (int c = 1;c<=m;c++) cout << Map[v][c] << ' '; cout << endl; } */ } //cout << 3 << endl; //cout << player[i].size() << endl; } if (flag <= 0) break ; //cout << 4 << endl; } for ( int i = 1; i <= p; i++) printf ( "%d " , number[i]); printf ( "\n" ); return 0; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· 《HelloGitHub》第 106 期
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用