[ABC311D] Grid Ice Floor

前言:题解看不懂,太高深了(我太蒻了),于是自己写了一篇。


思路:bfs 大法,记录新的单次滑倒的中点(撞石头),并记录经过的点,总之还是很简单的。

代码:

#include <bits/stdc++.h>
using namespace std;
const int N=210;
int n,m;
int vis[N][N],cnt[N][N];
int dx[4]={0,0,-1,1};
int dy[4]={-1,1,0,0};
char mp[N][N];
struct State{int x,y;};
void bfs(){
	vis[1][1]=1;
	cnt[1][1]=1;
	queue<State> st;
	st.push({1,1});
	while(!st.empty()){
		for(int i=0;i<4;i++){
			int nx=st.front().x;
			int ny=st.front().y;
			while(mp[nx+dx[i]][ny+dy[i]]=='.'){
				nx+=dx[i],ny+=dy[i];
				cnt[nx][ny]=1;
			}
			if(vis[nx][ny]==0){
				st.push({nx,ny});
				vis[nx][ny]=1;
			}
			else continue;
		}
		st.pop();
	}
	return ;
}
int main(){
	cin>>n>>m;
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++) cin>>mp[i][j];
	}
	bfs();
	int ans=0;
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			if(cnt[i][j]==1)ans++;
	}
	cout<<ans;
	return 0;
}

尼堪尼玛

posted @ 2025-01-11 10:04  Tobaa  阅读(12)  评论(0)    收藏  举报