首页 > 其他分享 >Problem - 616C - Codeforces

Problem - 616C - Codeforces

时间:2023-09-28 13:58:03浏览次数:40  
标签:num int 616C Codeforces ++ vector dx dy Problem

Problem - 616C - Codeforces

C. The Labyrinth

如果是直接对\(*\)去跑dfs或者bfs的话无疑是会超时的

既然如此,那我们可以去对 \(.\) 跑搜索,将各个连通的 \(.\) 块标号并计算出连通块内的点的数量,然后去遍历\(*\)的时候只需要上下左右跑一下计算即可

啊,在\(bfs\)或\(dfs\)的时候千万不要每次都开\(n\times m\)的空间去标记点,只需要在外面开一个就好!

#include <bits/stdc++.h>
#define debug(a) cout<<#a<<"="<<a<<'\n';

using namespace std;
using i64 = long long;

typedef pair<i64, i64> PII;

vector<int> ans(1e6);

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	int n, m;
	cin >> n >> m;
	vector<string> g(n);
	for (auto &i : g)
		cin >> i;

	int u[] = {1, -1, 0, 0}, v[] = {0, 0, 1, -1};
	vector<vector<int>> G(n,vector<int>(m,0));
	int num = 0;

	vector vis(n, vector<bool>(m));
	auto bfs = [&](int x, int y) {
		queue<PII> Q;
		G[x][y] = num;
		Q.push({x, y});		
		i64 res = 1;
		vis[x][y] = true;
		while (Q.size()) {
			auto [x1, y1] = Q.front();
			Q.pop();
			for (int i = 0; i < 4; i ++) {
				int dx = x1 + u[i], dy = y1 + v[i];
				if (dx < 0 || dy < 0 || dx >= n || dy >= m || vis[dx][dy] || g[dx][dy] == '*')
					continue;
				Q.push({dx, dy});
				vis[dx][dy] = true;
				res ++;
				G[dx][dy] = num;
			}
		}
		return res % 10;
	};	

	for (int i = 0; i < n; i ++) {
		for (int j = 0; j < m; j ++) {
			if (g[i][j] == '.' && !G[i][j]) {
				++ num;
				ans[num] = bfs(i, j);				
			}
		}		
	}

	for (int i = 0; i < n; i ++) {
		for (int j = 0; j < m; j ++) {
			if (g[i][j] == '*') {
				int res = 1;
				int f[4]{0};				
				for (int k = 0; k < 4; k ++) {
					int dx = i + u[k], dy = j + v[k];
					if (dx < 0 || dy < 0 || dx >= n || dy >= m || g[dx][dy] == '*' )						
						continue;
					if(G[dx][dy] == f[0] || G[dx][dy] == f[1] || G[dx][dy] == f[2] || G[dx][dy] == f[3]) 
						continue;
					f[k] = G[dx][dy];
					res += ans[G[dx][dy]];
				}
				cout << res % 10;
			} else
				cout << g[i][j];
		}
		cout << '\n';

	}
	return 0;
}

标签:num,int,616C,Codeforces,++,vector,dx,dy,Problem
From: https://www.cnblogs.com/Kescholar/p/17735562.html

相关文章

  • CF957 Codeforces Round 472 (rated, Div. 2, based on VK Cup 2018 Round 2)
    CF957ATritonicIridescence如果原序列中有两个相同的字符,显然不合法。如果开头或者结尾为?,或者有两个连续的?,或者一个?两边的字符不同显然合法。否则一定不合法。#include<iostream>#include<cstdio>usingnamespacestd;constintN=105;intn;chars[N];intma......
  • CF992 Codeforces Round 489 (Div. 2)
    CF992ANastyaandanArray答案为非零数的个数。#include<iostream>#include<cstdio>#include<map>usingnamespacestd;constintN=100005;intn;inta[N];map<int,int>cnt;intmain(){ scanf("%d",&n); for(inti=1;i<=n;i+......
  • CF1008 Codeforces Round 497 (Div. 2)
    CF1008ARomaji直接模拟。#include<iostream>#include<cstdio>#include<cstring>usingnamespacestd;constintN=105;intn;chars[N];intmain(){ scanf("%s",s+1); n=strlen(s+1); for(inti=1;i<=n;i++) if(s[i]!='a......
  • CF996 Codeforces Round 492 (Div. 2) [Thanks, uDebug!]
    CF996AHittheLottery直接贪心尽可能的分配到\(k_5\),剩下的依次分配给\(k_4,k_3,k_2,k_1\)。#include<iostream>#include<cstdio>usingnamespacestd;intn;intk[6];intmain(){ scanf("%d",&n); k[5]=n/100,n%=100; k[4]=n/20,n%=20; k[3]=n/1......
  • CF1011 Codeforces Round 499 (Div. 2)
    CF1011AStages每次记下上一个选的位置,贪心能填就填。#include<iostream>#include<cstdio>usingnamespacestd;constintN=55;intn,k;chars[N];intcnt[27];intmain(){ scanf("%d%d",&n,&k); scanf("%s",s+1); for(inti=1;i<=n......
  • CF1020 Codeforces Round 503 (by SIS, Div. 2)
    CF1020ANewBuildingforSIS分类讨论\(a,b\)两个端点的几种情况就好了,特判\(t_a=t_b\)的情况。#include<iostream>#include<cstdio>#include<cmath>#include<algorithm>usingnamespacestd;intn,h,a,b,k;voidsolve(){ intta,fa,tb,fb; scanf(&qu......
  • CF1036 Educational Codeforces Round 50 (Rated for Div. 2)
    CF1036AFunctionHeight答案为\(\lceil\frac{k}{n}\rceil\)。#include<iostream>#include<cstdio>usingnamespacestd;longlongn,k;intmain(){ scanf("%lld%lld",&n,&k); printf("%lld",(k+n-1)/n); return0;}......
  • CF1079 Codeforces Round 522 (Div. 2, based on Technocup 2019 Elimination Round 3
    CF1079AKitchenUtensils令\(c_i\)表示餐具\(i\)出现的数量,最小的餐具套数为\(t=\lceil\frac{\max\{c_i\}}{k}\rceil\),按照这个计算就好了。#include<iostream>#include<cstdio>#include<algorithm>usingnamespacestd;constintN=105;intn,k;inta[N]......
  • CF1072 Codeforces Round 517 (Div. 2, based on Technocup 2019 Elimination Round 2
    CF1072AGoldenPlate第\(i\)个矩形的周长为\(2(w-4(i-1))+2(h-4(i-1))-4\),枚举\(i\)求和。#include<iostream>#include<cstdio>usingnamespacestd;intn,m,k;intmain(){ scanf("%d%d%d",&n,&m,&k); intans=0; for(i......
  • CF1162 Codeforces Round 557 (Div. 2) [based on Forethought Future Cup - Final Ro
    CF1162AZoningRestrictionsAgain每个位置越高越好,暴力模拟即可。#include<iostream>#include<cstdio>usingnamespacestd;constintN=55;intn,h,m;inta[N];intmain(){ scanf("%d%d%d",&n,&h,&m); for(inti=1;i<=n;i++) a[i]=h;......