zhengyi0402 @ 2024-10-11 20:28:07
#include <bits/stdc++.h>
using namespace std;
int n, m, isOk;
char a[105][105];
bool vis[105][105];
struct Pos {
int x, y;
};
void bfs() {
queue<Pos> q;
Pos tmp;
tmp.x = 1, tmp.y = 1;
q.push(tmp);
while(!q.empty()) {
Pos now = q.front(); // 取 q 的队首元素
q.pop(); // 将 q 的队首出队
int x = now.x, y = now.y;
if(x < 1 || x > n) continue; // 如果 x 的坐标范围非法则跳过
if(y < 1 || x > m) continue; // 如果 y 的坐标范围非法则跳过
if(a[x][y]=='#') continue; // 如果第 x 行第 y 列是墙则跳过
if(vis[x][y]) continue; // 若第 x 行第 y 列已经访问过,则跳过
vis[x][y]=1; // 将第 x 行第 y 列设置为已经访问过
if(x == n && y == m){ // 如果到达终点
isOk = true; return;
}
Pos nxt;
nxt.x = x - 1, nxt.y = y; // 扩展上方相邻结点
q.push(nxt); // 将这个新的结点放入队列
nxt.x = x + 1, nxt.y = y; // 扩展上方相邻结点
q.push(nxt); // 将这个新的结点放入队列
nxt.x = x, nxt.y = y-1; // 扩展上方相邻结点
q.push(nxt); // 将这个新的结点放入队列
nxt.x = x, nxt.y = y+1; // 扩展上方相邻结点
q.push(nxt); // 将这个新的结点放入队列
}
}
int main() {
cin >> n >> m;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
cin >> a[i][j];
bfs();
if(isOk)
cout << "Yes" << endl;
else
cout << "No" << endl;
return 0;
}
/*
样例输入:
3 5
.##.#
.....
...#.
样例输出
Yes
*/
洛谷网校上A了,但只拿了60pts
by zzz13579zzz @ 2024-10-11 20:33:29
if(y < 1 || x > m) continue;
by zhengyi0402 @ 2024-10-11 20:41:03
Thanks! @ zzz13579zzz 关注你了