中国象棋
样例输入:
.#....#S#
..#.#.#..
..##.#..#
......##.
...T.....
...#.#...
...#.....
...###...
.........
.##......
输出:Yes
1 #include<iostream>
2 #include<cstring>
3 using namespace std;
4 int m=9,n=10;
5 int beginx,beginy;
6 //方向可用一维数组表示,也可以用二维数数组表示,对于表格形式
7 int dir[8][2] = {{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,+2},{2,-1},{2,1}};
8 int total;
9 bool mark[10][9];//表格是否走过
10 char map[10][9];//map 记录的是该表
11 bool check(int x,int y)
12 {
13 if (map[x][y]=='#')
14 return false;
15 if(x<n&&y<m&&x>=0&&y>=0)
16 return true;//判断是否越界
17 else
18 return false;
19 }
20 void dfs(int r,int c)
21 {
22 for(int i=0;i<8;i++)
23 //往下一层走的条件是(1)该点没有越界 (2)该点没有走过 (3)是否可走
24 if(check(r+dir[i][0],c+dir[i][1])&&!mark[r+dir[i][0]][c+dir[i][1]])
25 {
26 if (map[r+dir[i][0]][c+dir[i][1]]=='.')
27 {
28 r+=dir[i][0];
29 c+=dir[i][1];
30 mark[r][c]=1;//该点走过了
31 dfs(r,c);
32 r-=dir[i][0];
33 c-=dir[i][1];
34 }
35 //找到终点,退出,
36 if(map[r+dir[i][0]][c+dir[i][1]]=='T'){
37 //total++可以用来计算有多少种方法到达该点
38 cout<<"yes"<<endl;
39 //测试代码,证明找到了
40 // cout<<"r+dir[i][0]= "<<r+dir[i][0]<<"c+dir[i][1]"<<c+dir[i][1]<<endl;
41 //exit(0)用于剪枝函数
42 exit(0);
43 }
44 }
45 }
46 int main()
47 {
48 memset(mark,0,sizeof(mark));//置标记,刚开始所有的点没有走过
49 total=0;
50 for(int i=0;i<n;i++)
51 {
52 cin>>map[i];
53 for(int j=0;j<m;j++)
54 if(map[i][j]=='S'){beginx=i;beginy=j;}
55 }
56 dfs(beginx,beginy);
57 }
因上求缘,果上努力~~~~ 作者:图神经网络,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/12670856.html