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