迷宫寻找路径数

题目背景

给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。

输入格式

第一行

输入n行m列 障碍个数numObs

第二行

起始点xbegin ybegin 终止点xend yend

接下来numObs行

每行输入障碍的坐标

输出格式

路径条数

输入:

2 2 1
1 1 2 2
1 2

输出

1

思路:采用bfs,四个方向,找到一个可以走的点就把当前点作为起点就进入递归,然后把当前点的四个方向遍历,然后再递归,一直到找到终点返回到上一个状态再寻找另一个方向,找完后再返回,知道上一个状态的点的方向都找完之后再返回一个状态继续,返回状态的同时记得要把标记走过的路再还原。

 1 #include<iostream>
 2 #include<vector>
 3 #include<algorithm>
 4 
 5 using namespace std;
 6 
 7 bool temp[7][7];//标记是否走过
 8 int maze[7][7];
 9 int dx[] = {0, 0, 1, -1};
10 int dy[] = {-1, 1, 0, 0};
11 int n, m, xbegin, ybegin, xend, yend, xObs, yObs, res = 0, numObs;
12 
13 void bfs(int x, int y)
14 {
15     if(x == xend && y == yend)
16     {
17         res++;
18         return;
19     }
20     else
21     {
22         for(int i = 0; i < 4; i++)
23         {
24             if(temp[x+dx[i]][y+dy[i]] == 0 && maze[x+dx[i]][y+dy[i]] == 1)
25             {
26                 temp[x][y] = 1;
27                 bfs(x+dx[i], y+dy[i]);
28                 temp[x][y] = 0; //还原
29             }
30         }
31     }
32 }
33 
34 int main()
35 {
36     cin >> n >> m >> numObs;
37     for(int i = 1; i <= n; i++)
38     {
39         for(int j = 1; j <= m; j++)
40         {
41             maze[i][j] = 1;
42         }
43     }
44     cin >> xbegin >> ybegin >> xend >> yend;
45     for(int i = 0; i < numObs; i++)
46     {
47         cin >> xObs >> yObs;
48         maze[xObs][yObs] = 0;
49     }
50     bfs(xbegin, ybegin);
51     cout << res << endl;
52     system("pause");
53     return 0;
54 }
原文地址:https://www.cnblogs.com/ZhengLijie/p/12911061.html