迷宫寻找路径数
题目背景
给定一个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 }