由于本题的来源在 AtCoder 上,是日文,而在洛谷上也直接给出了题目翻译和大意,如下:👇👇👇
题意翻译:
高桥先生住的小区是长方形的,被划分成一个个格子。高桥先生想从家里去鱼店,高桥先生每次可以走到他前后左右四个格子中的其中一个,但不能斜着走,也不能走出小区。
现在给出地图:
s:代表高桥先生的家
g:代表鱼店
.:代表道路
#:代表墙壁
高桥先生不能穿过墙壁。
输入:第一行输入n(1<=n<=500),m(1<=m<=500)代表小区的长和宽,接下来n行每行m个字符,描述小区中的每个格子。
输出:如果高桥先生能到达鱼店,输出"Yes",否则输出"No"。
样例输入1:(一共有五组,不是多实例)
4 5
s####
....#
#####
#...g
样例输出1:
No
样例输入2:
4 4
...s
....
....
.g..
样例输出2:
Yes
样例输入3:
10 10
s.........
#########.
#.......#.
#..####.#.
##....#.#.
#####.#.#.
g.#.#.#.#.
#.#.#.#.#.
###.#.#.#.
#.....#...
样例输出3:
No
样例输入4:
10 10
s.........
#########.
#.......#.
#..####.#.
##....#.#.
#####.#.#.
g.#.#.#.#.
#.#.#.#.#.
#.#.#.#.#.
#.....#...
样例输出4:
Yes
样例输入5:
1 10
s..####..g
样例输出5:
No
AC Code:
#include<bits/stdc++.h> using namespace std; const int N=501; char s[N][N];//存入地图的数组 int vis[N][N];//标记数组 int n,m,sx,sy,ex,ey,flag; int dx[]={0,0,1,-1};//这两个是方向数组 int dy[]={1,-1,0,0}; bool judge(int x,int y) {//越界判断的函数 if(x>=0&&x<n&&y>=0&&y<m) return true; return false; } void dfs(int x,int y) { vis[x][y]=1;//每次都将搜索到的这个点标记为1 if(x==ex&&y==ey) {//此时已走到终点 flag=1; return ; } for(int i=0;i<4;i++) {//上下左右四个方向搜索 int tx=x+dx[i]; int ty=y+dy[i]; if(judge(tx,ty)&&vis[tx][ty]==0&&s[tx][ty]!='#') {//不越界、这个点未被访问并且不能是围墙 dfs(tx,ty);//继续下一个满足点的搜索 } } } int main() { scanf("%d %d",&n,&m); for(int i=0;i<n;i++) for(int j=0;j<m;j++) scanf(" %c",&s[i][j]);//%前面的空格确保可以完整输入 memset(vis,0,sizeof(vis));//标记数组清零 for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(s[i][j]=='s') {//找到起点 sx=i; sy=j; } if(s[i][j]=='g') {//找到终点 ex=i; ey=j; } } } dfs(sx,sy);//将起点代入,开始搜索 if(flag==1) {//可以到达 printf("Yes\n"); }else {//无法到达 printf("No\n"); } return 0; }