题目:
马走日,不考虑别马脚,问马能否从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";}}