列表

详情


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;
	
}

上一题