DFS象棋问题

#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;
}

  

猜你喜欢

转载自www.cnblogs.com/jcahsy/p/12455207.html