首页 > 其他分享 >Toyota Programming Contest 2023#4(AtCoder Beginner Contest 311)——D

Toyota Programming Contest 2023#4(AtCoder Beginner Contest 311)——D

时间:2023-07-23 15:11:43浏览次数:44  
标签:AtCoder Beginner Contest int 311 abc311 while rep

https://atcoder.jp/contests/abc311/tasks/abc311_d

思路

题目说如果当前方向的下一个点能走,那么就一直走,否则才能转向。根据题意模拟即可,这道题的难点在于,碰到已经走过的点到底要不要走。如果当前方向走到底,其中的点之前全部都走过那么就不能再走了。
我们用bfs模拟,对于能一直走的点,while循环走。然后走到底的点加入队列。

代码

#include<bits/stdc++.h>
#define int long long
#define rep(i,x,y) for(int i=x; i<=y; ++i)
#define pushk push_back
using namespace std;
const int N = 200+9;
char s[N][N];
int n,m,ans;
bool vis[N][N];
struct node {
	int x,y;
};
int dx[5]= {-1,1,0,0};
int dy[5]= {0,0,-1,1};
signed main() {
	cin>>n>>m;
	rep(i,1,n) {
		cin>>s[i]+1;
	}
	queue<node> q;
	q.push({2,2});
	vis[2][2]=1;
	while(q.size()) {
		auto tmp = q.front();
		q.pop();
		for(int i=0; i<4; ++i) {
			int nx = tmp.x+dx[i];
			int ny = tmp.y+dy[i];
			int cnt=0;
			while((nx>1&&ny>1&&nx<n&&ny<m) && s[nx][ny]=='.') {
				if(!vis[nx][ny]) cnt++;
				vis[nx][ny]=1;
				nx=nx+dx[i];
				ny=ny+dy[i];
			}
			nx-=dx[i],ny-=dy[i];
			if(cnt) {
				q.push({nx,ny});
			}
		}
	}
	rep(i,1,n) {
		rep(j,1,m) {
			if(vis[i][j]) ans++;
		}
	}
	cout<<ans;
	return 0;
}
/*
5 6
######
#oooo#
#o#oo#
oo#ooo
######

*/

标签:AtCoder,Beginner,Contest,int,311,abc311,while,rep
From: https://www.cnblogs.com/Jin-yt/p/17575029.html

相关文章

  • AtCoder Beginner Contest 311 A-E题解
    A-FirstABC题意给一个长度为N的仅由ABC三个字符组成的字符串S,问S中ABC三个字符第一次出现的位置的最大值。题解使用map<char,bool>判重,记录当前不同的字符串的个数cnt,当cnt等于3时,输出此时的下标+1作为答案。Code#include<bits/stdc++.h>usingnamespacestd;usingll......
  • AtCoder Beginner Contest 311
    A-FirstABC(abc311A)题目大意给定一个字符串,问最短的一个前缀,包含ABC这三个字符。解题思路注意到这个前缀的末尾字母一定是这三个字母中的一个,因此答案就是这三个字母出现位置最早的最大值。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=lo......
  • 2023.07.21 SMU Summer 2023 Contest Round 5
    2023.07.21SMUSummer2023ContestRound5A.PointsinSegments给n个,1~m的子集,求1~n中所有没在这些子集中出现过的数字把子集区间合并为集合s,输出1~n中没有在s中出现过的数#include"bits/stdc++.h"usingnamespacestd;typedefpair<int,int>PII;intn,m;vector<P......
  • Atcoder Regular Contest 154 E - Reverse and Inversion
    只要你发现是诈骗题就好办了。不要像我那样傻傻地瞪一个小时然后才发现那俩sigma里的东西相减是有性质的。先考虑计算单个\(f(p)\),一眼的树状数组……吗?考虑最终答案式子里\(i\)的系数:\(\sum\limits_{j<i}[p_j>p_i]-\sum\limits_{j>i}[p_j<p_i]\),因为\(\sum\limits_{j<i}[p......
  • SMU Summer 2023 Contest Round 5
    SMUSummer2023ContestRound5A.PointsinSegments\(\mathcal{O}(n\timesm)\)做法数据范围小,直接把每次的\(l-r\)跑一遍标记一下,最后跑一遍循环统计哪些没有被标记的并且输出就好了#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;signed......
  • Atcoder Regular Contest 124 E - Pass to Next
    首先第一步是一个浅显的观察:我们要求的是所有可能的最终序列的贡献之和,如果能改为计算所有操作序列的贡献之和那问题会简单很多,并且我们惊奇地发现,如果一组\(x_i\)全大于\(0\),那么把它们全减去\(1\)以后得到的答案序列不会改变,而对于任意一种可能的最终序列,必然存在一组\(\m......
  • Atcoder Grand Contest 057 D - Sum Avoidance
    先来找些性质:\(A\)中最小的元素\(M\)肯定是最小的不是\(S\)的因子的数,由于\(\text{lcm}(1,2,3,\cdots,43)>10^{18}\),所以\(M\le43\)。对于每个\(0\lei<M\),\(\bmodM=i\)的数被选择的部分必然是一段后缀,因为如果你选择了\(M\)选择了某个\(\bmodM=i\)的数\(v\),......
  • AtCoder Grand Contest 049 E Increment Decrement
    洛谷传送门AtCoder传送门好题。同时考查了slopetrick和选手的计数能力,不愧是AGCE。先考虑问题的第一部分。你现在有一个初始全为\(0\)的序列\(b\)。你每次可以给\(b\)单点\(\pm1\),代价为\(1\),或区间\(\pm1\),代价为\(m\)。求把\(b\)变成给定序列\(a\)的......
  • AtCoder Beginner Contest 310
    A-OrderSomethingElse#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongint32_tmain(){ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);intn,p,q;cin>>n>>p>>q;......
  • 【2023.07.14】Atcoder:past201912 - 第一回 アルゴリズム実技検定(div4+区域赛难度)过题
    G-Division解法一:位运算+状压枚举(赛时思路)范围显然,可以跑\(2^n\)的算法,考虑位运算状态压缩。以\(\mathcalO(2^n\cdot2^n)\)的复杂度分别枚举位于第一组、第二组中的人,随后计算每一种分组的快乐值,代码较长,赛时敲了半个小时,不过好在一发过了。总结:其实代码里面的剪枝完......