首页 > 其他分享 >AtCoder Beginner Contest 311 - D(思维题)

AtCoder Beginner Contest 311 - D(思维题)

时间:2023-08-17 22:22:31浏览次数:33  
标签:AtCoder Beginner int 311 玩家 yy ss xx maxm

目录

ABC 简单题
D 思维题

D - Grid Ice Floor

题意
给定一个 \(n \times m\) 的矩阵,矩阵每个位置上的字符要么是 '.' 要么是 '#',保证矩阵的最外围一圈都是 '#'。玩家初始位于位置 (2, 2)。玩家可以进行移动,但是移动有条件:玩家首先选定一个移动方向,之后在这个方向上一直移动,知道遇到 '#' 为止,即玩家只能移动到字符是 '.' 的位置。
问你玩家能够经过多少个位置 '.' ?

思路
刚开始的思路是搜索,但是搜索有个问题,就是可能会漏,因为每个位置是可以重复到达的,为了使得玩家可以到达尽可能多的未到达的位置。
所以除去搜索的思路,我们利用一个队列来不重地记录每次停下的位置,并再这个位置向四个方向延伸,以此来找遍所有的可达位置,同时记录答案即可。

代码

//>>>Qiansui
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define mem(x,y) memset(x, y, sizeof(x))
#define debug(x) cout << #x << " = " << x << '\n'
#define debug2(x,y) cout << #x << " = " << x << " " << #y << " = "<< y << '\n'
//#define int long long

using namespace std;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<ull, ull> pull;
typedef pair<double, double> pdd;
/*

*/
const int maxm = 2e2 + 5, inf = 0x3f3f3f3f, mod = 998244353;
int n, m, ans,
fx[4] = {1, 0, -1, 0},
fy[4] = {0, -1, 0, 1};
bool vis[maxm][maxm], pos[maxm][maxm];
string ss[maxm];

void solve(){
	cin >> n >> m;
	for(int i = 1; i <= n; ++ i){
		cin >> ss[i];
		ss[i] = 'a' + ss[i];
	}
	vis[2][2] = true;
	queue<pii> q;
	q.push({2, 2});
	while(!q.empty()){
		auto [x, y] = q.front();
		q.pop();
		if(pos[x][y]) continue;
		vis[x][y] = true;
		pos[x][y] = true;
		int xx, yy;
		for(int i = 0; i < 4; ++ i){
			xx = x; yy = y;
			while(1){
				xx += fx[i]; yy += fy[i];
				if(ss[xx][yy] == '.'){
					vis[xx][yy] = true;
				}else{
					xx -= fx[i]; yy -= fy[i];
					if(!pos[xx][yy]) q.push({xx, yy});
					break;
				}
			}
		}
	}
	for(int i = 1; i <= n; ++ i){
		for(int j = 1; j <= m; ++ j){
			if(vis[i][j]) ++ ans;
		}
	}
	cout << ans << '\n';
	return ;
}

signed main(){
	ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
	int _ = 1;
	// cin >> _;
	while(_ --){
		solve();
	}
	return 0;
}

标签:AtCoder,Beginner,int,311,玩家,yy,ss,xx,maxm
From: https://www.cnblogs.com/Qiansui/p/17638999.html

相关文章

  • AtCoder-ABC-267 C - Index × A(Continuous ver
    C-Index×A(Continuousver.)题目大意:给定n个数(\(a_1,a_2...a_n\)),从中选连续m个数,这m个数的和为:\(\sum_{i=1}^mi*b_i\)求最大的和为多少。\(1<=m<=n<=2*10^5\)\(-2*10^5<=a_i<=2*10^5\)解题思路首先m个数为一组,那么最多有n-m+1组,这个数量是可以被遍历的,但是......
  • AtCoder-ABC-309 C - Medicine
    C-Medicine题目大意:给n种药,第i种药吃\(a_i\)天,每天\(b_i\)粒。问最早在第几天,当天要吃的药≤K。\(1<=n<=3*10^5\)\(0<=k<=10^9\)\(1<=a_i,b_i<=10^9\)解题思路首先了解了n种药,每次都是从第一天开始,持续\(a_i\)天,所以我当时直接想到用差分来做,数组初始全为......
  • AtCoder Beginner Contest 314
    AtCoderBeginnerContest314-AtCoderA-3.14(atcoder.jp)题目提供了100位,所以直接用字符串输出#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;signedmain(){ios::sync_with_stdio(false);cin.tie(nullptr);strings="3.14......
  • AtCoder Beginner Contest 314
    AtCoderBeginnerContest314-AtCoderA3.14voidsolve(){strings="3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679";intn;cin>>n;cout<<s.substr(0,n......
  • mysql在开启group_replication后,状态显示为RECOVERING,告警日志报错MY-013117、MY-0115
    问题描述:mysql在开启group_replication后,状态显示为RECOVERING,告警日志报错MY-013117、MY-011582、MY-011583,如下所示:数据库:MySQL8.0.27系统:rhel7.364位1、问题重现Slave02[(none)]>select*fromperformance_schema.replication_group_members;+-----------------------......
  • AtCoder Beginner Contest 314 A - Ex题解
    AtCoderBeginnerContest314A-3.14嗯,你可以用string存小数点后的...B-Roulette对于每一个金额,用个vector存pair<>存一个人赌了多少,以及是哪一个人。C-RotateColoredSubsequence每种数用个双向链表记下来。D-LOWER我们观察到,对于2,3操作,只有最后一次有用,且......
  • AtCoder Beginner Contest 214
    AtCoderBeginnerContest214-AtCoder [ABC214D]SumofMaximumWeights ------------------------------(典)题意:给出一颗N-1 条边的树,求树上任意两点间路径上的最大值的和这种问题考虑每条边单独看贡献,但是刚开始没太想明白怎么计算贡献,后面看了洛谷题解才懂了-......
  • Atcoder杂题笔记
    大概会把博客当草稿纸用(当然写出正解还是会把正解贴出来。[ARC080E]YoungMaids(待补代码)给定正偶数\(N\)。给定\(N\)元排列\(p=(p_1,p_2,...,p_N)\).Snuke打算根据下述步骤构造一个\(N\)元排列\(q\)。首先,令\(q\)为空。接下来,执行下述操作直到\(p\)为空......
  • Atcoder ABC307_G-Approximate Equalization 序列dp
    AT_ABC307_G-ApproximateEqualization没想到还有ApproximateEqualizationII!!:AT_ABC313_CDescription:给定一个长度为\(N\)的数列:\(A=(A_1,A_2,···,A_N)\),有两种操作可以以任意顺序进行任意多次(可以为0):\(A[i]-\)=\(1\)且\(A[i+1]+\)=\(1\),\((1\leqi\leqN-1)......
  • AtCoder-ARC073_A Sentou
    Sentou【题意】:有一个开关,当按下开关后的T秒内会一直放水,当在放水状态时,如果有人再次按下开关,那么停止放水,并从按下的那一刻起的T秒会再次一直放水,给出n个人按压开关的时间,问总共流出多少水【思路】:简单模拟#include<bits/stdc++.h>usingnamespacestd;typedeflon......