版权声明:所有内容仅供大家学习与复习使用,请勿用于任何商业用途;维特根斯坦曾说过,凡可说的,皆无意义。凡有意义的,皆不得不以荒唐的语言传递其意义。我十分赞同。 https://blog.csdn.net/qq_40828914/article/details/88414143
题目:
马走日,不考虑别马脚,问马能否从S走到T,其中‘#’表示不能落下,‘.’表示能落下
输入:
.#....#S#
..#.#.#..
..##.#..#
......##.
...T.....
...#.#...
...#.....
...###...
.........
.##......
输出:
Yes
分析与解答:
如果在for的下面加上回溯vis[x][y]=false;
,时间超时,有的时候如果只用考虑能否到达,而不用考虑具体路径,只用增加一个全局变量f,能走到的话就f就为true了,不能的话dfs函数全部遍历一遍,也没改变f,此时f就是初始的false。不用加上回溯。
凭感觉来说,整个完整搜索树的时间要小于通过回溯找到路径的最坏的可能时间。所以说,如果只用考虑能否到达,那就不用回溯。
代码:
#include<iostream>
#include<string>
using namespace std;
string maze[12];
bool vis[15][15];
int dir[8][2]={{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2},{2,-1}};//行,列
bool f;
int in (int x,int y){
if(0<=x&&x<10&&0<=y&&y<9){
return 1;
}
else return 0;
}
void dfs(int x,int y){
vis[x][y]=true;
if(f){
return ;
}
if(maze[x][y]=='T'){
f=true;
return ;
}
for(int i=0;i<8;++i){
int tx=x+dir[i][0];
int ty=y+dir[i][1];
if(in(tx,ty)&&maze[tx][ty]!='#'&&!vis[tx][ty]){
dfs(tx,ty);
}
}
}
int main(){
for(int i=0;i<10;++i){
cin>>maze[i];
}
int x,y;
for(int i=0;i<10;++i){
for(int j=0;j<9;++j){
if(maze[i][j]=='S'){
x=i;y=j;
}
}
}
dfs(x,y);
if(f){
cout<<"Yes";
}
else{
cout<<"No";
}
}