中国象棋

 

样例输入:
.#....#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 }

 

posted @ 2020-04-10 01:35  多发Paper哈  阅读(110)  评论(0编辑  收藏  举报
Live2D