描述
500年前,Jesse是我国最卓越的剑客。他英俊潇洒,而且机智过人^_^。
突然有一天,Jesse心爱的公主被魔王困在了一个巨大的迷宫中。Jesse听说这个消息已经是两天以后了,他急忙赶到迷宫,开始到处寻找公主的下落。
请你判断他是否能救出心爱的公主。(假设有路可以通到公主那就可以找到公主)。
输入
题目包括多组测试数据。
每组测试数据以两个整数n,m(0<n, m≤20)开头,分别代表迷宫的长和高。紧接着有m行,n列字符,由".","*","P","S"组成。其中
"." 代表能够行走的空地。
"*" 代表墙壁,Jesse不能从此通过。
"P" 是公主所在的位置。
"S" 是Jesse的起始位置。
Jesse只能选择上、下、左、右任意一方向走一步。
输入以0 0结束。
输出
如果能救出公主输出YES,否则输出NO。
样例输入
4 4
....
....
....
S**P
4 4
....
....
****
S**P
0 0
样例输出
YES
NO
提示
输入0 0结束可以这样,
参考:
while(scanf("%d %d",&n,&m),m||n)
{
}
#include<bits/stdc++.h> using namespace std; int n,m,f; //n行m列,f作为终点标记 int sx,sy,ex,ey;//起点终点坐标 int nex[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};//方向数组,右下左上 int vis[105][105]; //标记数组 char a[105][105]; //地图 void dfs(int x,int y); //声明dfs函数 int main() { while(cin>>m>>n) //多组数据输入 { if(n==0&&m==0)break; //如果输入的n,m是0结束循环 for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)//双重循环输入地图 { cin>>a[i][j]; //输入第i行第j列的字符 if(a[i][j]=='S') //起点 { sx = i;sy = j; } if(a[i][j]=='P') //终点 { ex = i;ey = j; } } memset(vis,0,sizeof(vis)); //初始化标记数组vis为0,表示整个地图没有走过 f = 0; //初始化f dfs(sx,sy); //起点传入,开搜 if(f==1) cout<<"YES"<<endl; //如果f执行完dfs为1,则找到了公主,输出yes else cout<<"NO"<<endl; } return 0; } void dfs(int x,int y) { if(f==1)return; //如果f=1找到终点,直接返回程序 if(x==ex&&y==ey) { f = 1; //找到终点 return; } for(int i=0;i<4;i++) //循环4个方向 { int tx = x + nex[i][0]; int ty = y + nex[i][1]; //获取下一步的坐标tx,ty if(tx<1||tx>n||ty<1||ty>m)continue; //越界判断,判断tx,ty行列是否越界 if(a[tx][ty]!='*' && vis[tx][ty]==0) //如果下一步不是*且vis数组没有标记过 { vis[tx][ty] = 1; //vis数组标记1就证明该点走过 dfs(tx,ty);//将tx,ty作为下一步的起点传入继续搜索 } } }
标签:Hero,tx,ty,int,DFS,2777,vis,公主,Jesse From: https://www.cnblogs.com/jyssh/p/16757378.html