
#include<cstdio>
using namespace std;
char maze[15][15];//用来存储棋盘的大小
bool vis[15][15];//存储判断当前点是否走过
int n,m; //棋盘的行和列
bool f; //标识
int dir[8][2]={{-2,-1},{-1,-2},{1,-2},{1,2},{2,1},{1,2},{-1,2},{-2,1}}; //马 能走的八个方向
bool in(int x,int y){
return x>=0&&x<n&&y>=0&&y<m;
}
//in函数用来判断是否越界
void dfs(int x,int y){
if(f){
return ;
}//过程中有找到也直接返回,减少一定的开销
if(maze[x][y]==‘T‘){
f=true;
return;
}//找到T就返回,标识记为true
if(in(x,y)&&maze[x][y]!=‘*‘&&!vis[x][y]){
vis[x][y]=true;//当前点可以走,讲VIS记为走过
for(int i=0;i<8;i++){
dfs(x+dir[i][0],y+dir[i][1]);
}
//8个方向去穷尽式的枚举
vis[x][y]=false;
//取消标识
}
}
int main(){
int x,y; //用来记录起点的坐标
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%c",&maze[i][j]);
}
}//输入棋盘
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(maze[i][j]==‘S‘){
x=i;
y=j;
}
}
}
dfs(x,y);
if(f){
printf("YES!\n");
}else{
printf("No!\n");
}
return 0;
}
原文:https://www.cnblogs.com/jcahsy/p/12455207.html