(DFS)跳马

版权声明:所有内容仅供大家学习与复习使用,请勿用于任何商业用途;维特根斯坦曾说过,凡可说的,皆无意义。凡有意义的,皆不得不以荒唐的语言传递其意义。我十分赞同。 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";
	}
	
} 

猜你喜欢

转载自blog.csdn.net/qq_40828914/article/details/88414143
dfs