【BFS】冰面滑行

冰面滑行

题目描述

有一个 N×M 的网格,每个格子是冰面 . 或岩石 #。整个网格最外圈保证全部是岩石。

玩家最初停在格子 (2,2),该格子保证是冰面。

一次操作中,玩家先选择上、下、左、右中的一个方向,然后沿该方向持续滑行,直到下一格是岩石为止。若下一格已经是岩石,则玩家原地不动并结束本次操作。

玩家可以进行任意多次操作。

一个冰面格子只要玩家能够在某次滑行中经过它,或者停在它上面,就称这个格子"可触达"。

请计算可触达的冰面格子数量。

输入格式

第一行两个整数 N,M。

接下来 N 行,每行一个长度为 M 的字符串 Si。

输出格式

输出可触达冰面格子的数量。

解题思路

这题和普通连通块不同,每个格子不能四个方向搜索,如果选定了一个方向去探索,后续格子都要以这个方向去探索,直到下一步碰到岩石,这时才可以换别的方向。

怎么搜索可达的位置呢?我们开一个队列存储可以换向的格子,对于这种格子遍历四个方向探索。选定方向后,我们可以用一个while循环单向探索直到下一个碰到岩石(后称这种格子叫临界格子)。然后我们判断临界格子是否有标记过,如果没有,则格子入队。在单向探索时,如果这个格子标记为可达的(同时也具有被访问的标记)。

最后数一下标记过的格子数量,输出答案。

AC Code

cpp 复制代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n, m, p[205][205], ans=0;
char mp[205][205];
struct xy{
	int x, y;
};
queue<xy>q;
int dx[5]={0, 0, 0, 1, -1};
int dy[5]={0, 1, -1, 0, 0};
signed main(){
	memset(p, -1, sizeof(p));
	cin>>n>>m;
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= m; j++){
			cin>>mp[i][j];
		}
	}
	q.push({2, 2});
	p[2][2]=1;
	while(!q.empty()){
		int x=q.front().x, y=q.front().y;
//		cout<<x<<" "<<y<<'\n';
		q.pop();
		for(int i = 1; i <= 4; i++){
			int xx=x, yy=y;
			while(xx+dx[i]>=1&&xx+dx[i]<=n&&yy+dy[i]>=1&&yy+dy[i]<=m&&mp[xx+dx[i]][yy+dy[i]]=='.'){
				p[xx][yy]=1;
				xx+=dx[i];
				yy+=dy[i];
			}
			if((xx!=x||yy!=y)&&p[xx][yy]==-1){
				p[xx][yy]=1;
				q.push({xx, yy});
			}
		}
	}
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= m; j++){
//			cout<<p[i][j]<<'\t';
			if(p[i][j]==1)ans++;
		}
//		cout<<'\n';
	}
	cout<<ans;
}
相关推荐
程序猿阿森7 小时前
深入解析 NLI:RAG 与大模型防幻觉的“最后一道防线”
前端·人工智能·算法
而后笑面对8 小时前
浅尝贝叶斯估计
人工智能·算法·机器学习
u0111026759 小时前
图片生成任务的日志记录与敏感信息取舍
前端·图像处理·算法·ai作画
花间相见10 小时前
【计算基础|MySQL08】索引(上):为什么是 B+ 树
数据结构·mysql·算法·架构
吠品10 小时前
Flutter 工程配本地 Maven 引 AAR,仓库声明为啥不生效
c语言·人工智能·算法
罗湖老棍子10 小时前
【例题1】黑暗城堡(信息学奥赛一本通- P1486)
算法·图论·最短路·dijkstra·最小生成树·最短路径生成树
hetao173383710 小时前
2026-10-20 hetao1733837 的刷题记录
c++·算法
碧海银沙音频科技研究院12 小时前
基于ATS308X的无线语音交互对话功能实现
人工智能·嵌入式硬件·深度学习·算法
尹玉玺12 小时前
从原子残片到天道公理:以德谟克利特思想全貌,重新定界西方唯物认知的历史层级与边界
人工智能·算法·架构