NC215155. 我到底能不能喝到星巴克!
描述
南宁师范大学的小明刚来到武鸣不熟悉新校区。假设武鸣校区是一个N*M的矩阵,小明的宿舍在地图中用“S”来表示,东门用“E”来表示,障碍物用“#”来表示,空地用“.”来表示。障碍物不能通过,小明若是现在在(x,y)处,那他下一步只能走到相邻的四个格子中的某一个(上,下,左,右)。
小明想知道,他能从宿舍走到东门拿到刚刚点的星巴克吗?
输入描述
先输入两个数字N,M
接下来N行,每行M个字符,表示地图的状态。
数据范围:
2<=N,M<=500
保证有一个宿舍S,同时保证有一个东门E.
输出描述
输出一行,如果小明能够从起点走到终点,那么输出Yes,否则输出No
示例1
输入:
3 3 S.. ..E ...
输出:
Yes
示例2
输入:
3 3 S## ### ##E
输出:
No
Python3 解法, 执行用时: 66ms, 内存消耗: 7564K, 提交时间: 2021-10-26 21:16:39
import time # 数据预处理 # 3 3 # S.. # ..E # ... n, m = map(int, input().split()) box = [list(input()) for _ in range(n)] for i in range(n): for j in range(m): if box[i][j] == "S": sx = i sy = j elif box[i][j] == "E": ex = i ey = j start = (sx,sy) end = (ex, ey) dirs = [[1, 0], [0, 1], [-1, 0], [0, -1]] seen = set() seen.add(start) def passable(x, y): if x >= 0 and x < n and y >= 0 and y < m and (x, y) not in seen and box[x][y] != "#": return True return False def dfs(): if start == end: return True stack = [] stack.append(start) while len(stack) > 0: pos = stack.pop() for i in range(4): prex = pos[0] + dirs[i][0] prey = pos[1] + dirs[i][1] if passable(prex, prey): prePos = (prex, prey) if prePos == end: return True else: stack.append(prePos) seen.add(prePos) return False if dfs(): print("Yes") else: print("No")
C++(clang++11) 解法, 执行用时: 4ms, 内存消耗: 896K, 提交时间: 2021-01-24 18:18:51
#include <bits/stdc++.h> using namespace std; int m,n; int flag = 0; char a[500][500]; struct Dian { int x; int y; }S,E; void fun(int x,int y) { if(x<0||x>=m||y<0||y>=n) return; if(a[x][y]=='#') return; a[x][y]='#'; if(x==E.x&&y==E.y) { flag = 1; return; } fun(x,y-1); fun(x-1,y); fun(x,y+1); fun(x+1,y); } int main() { cin>>n>>m; for(int i=0;i<m;i++) for(int j=0;j<n;j++) { cin>>a[i][j]; if(a[i][j]=='S') { S.x=i; S.y=j; } if(a[i][j]=='E') { E.x=i; E.y=j; } } fun(S.x,S.y); if(flag==1) cout<<"Yes"; else cout<<"No"; return 0; }