三、迷宫
题目描述
给定一个 N×M 方格的迷宫,迷宫里有 T 处障碍,障碍处不可通过。
在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。
给定起点坐标和终点坐标,每个方格最多经过一次,问有多少种从起点坐标到终点坐标的方案。
输入格式
第一行为三个正整数 N,M,T,分别表示迷宫的长宽和障碍总数。
第二行为四个正整数 SX,SY,FX,FY,SX,SY 代表起点坐标,FX,FY 代表终点坐 标。
接下来 T 行,每行两个正整数,表示障碍点的坐标。
输出格式
输出从起点坐标到终点坐标的方案总数。 输入输出样例
输入
2 2 1
1 1 2 2
1 2
输出
1
说明/提示
对于 100% 的数据, 1≤N,M≤5, 1≤T≤10, 1≤SX,FX≤n,1≤ , ≤ 。
视频题解
https://dl.ccf.org.cn/video/videoDetail.html?_ack=1&id=7092424600864768
AC代码
#include <iostream>
using namespace std;
int n,m,t,sx,sy,fx,fy,ans = 0 ;
int maze[11][11],used[11][11]; // 初始化为0
int FX[4][2] = { // 上、右、下、左(顺时间 偏移量 x,y )
{-1,0}, //上移 :行-1,列不变
{0,1}, //右移 : 行不变,列+1
{1,0}, //下移 : 行-1,列不变
{0,-1} //左移 : 行不变,列-1
};
void dfs(int x,int y){
if(x == fx && y == fy){// 到达终点
ans ++;
return;
}
used[x][y] = 1;
for(int i = 0 ; i <4; i++){
// 4个方向移动后
int nx = x + FX[i][0];
int ny = y + FX[i][1];
if( (nx >= 1&& nx <= n) && (y >= 1 && y <= m) &&
used[nx][ny] == 0 && maze[nx][ny] == 0){ // 不是障碍物且没有走过
used[nx][ny] = 1;//标记为走过
dfs(nx,ny);
// 回溯
used[nx][ny] = 0;
}
}
}
int main() {
cin >> n >> m >> t;
cin >> sx >> sy >> fx >> fy; // 起点坐标和终点坐标
// 障碍物
int x,y;
for(int i=1; i<= t;i++){
cin >> x >> y;
maze[x][y] = 1 ;// 标记为1,表示有障碍物
}
dfs(sx,sy); // 深度搜索
cout << ans;
return 0;
}