解题思路:
(1)本题为搜索的棋盘问题,需要统计所有的方案数,那么肯定会用到回溯,在一个迷宫中,从起点出发,可以从四种方向走,那么先设置行列号的方向数组的偏移量
(2)创建一个aa二维数组表示地图,标记1的地方为障碍,无法通过,设置一个bool 的vis数组,用来标记,这个点是否走过,如果走过的话标记为1,回溯的时候后退为0
(3)接下来从起点出发,朝着4个方向开始搜索,涉及到方向数组,要记得判断越界,递归的出口为,如果当前的步数已经超过了迷宫可走的格子,那么结束递归,如果此时的位置是终点的位置,那么就方案数加1,结束递归
(4)最后输出方案数即可
#include<bits/stdc++.h>
using namespace std;
int n,m,t;//表示迷宫的 宽长,障碍数量
int x,y,xx,yy;//表示起点和终点的位置
int ans;//表示方案数
bool vis[10][10];//表示标记数组
int aa[10][10];//表示迷宫的地图
int dx[5]={-1,1,0,0};//表示行号的方向数组
int dy[5]={0,0,-1,1};//表示列号的方向数组
//x表示当前走的步数,a,b表示当前的位置
void dfs(int x,int a,int b)
{
if(x>n*m-t)//如果步数超过了迷宫的格子
return ;//结束递归
if(a==xx&&b==yy)//如果当前 位置是终点
{
ans++;//方案数增加
return ;//结束递归
}
for(int i=0;i<=3;i++)
{
int X=a+dx[i];
int Y=b+dy[i];//形成新的坐标
if(X>n||X<1||Y>m||Y<1)//判断是否越界
continue;
if(aa[X][Y]==0&&vis[X][Y]==0)//如果这个位置不是障碍并且没走过的话
{
vis[X][Y]=1;//保存现场
dfs(x+1,X,Y);//开始下一步
vis[X][Y]=0;//回溯,恢复现场
}
}
}
int main()
{
int t1,t2;//障碍点的坐标
cin>>m>>n>>t;
cin>>x>>y>>xx>>yy;
for(int i=1;i<=t;i++)
{
cin>>t1>>t2;
aa[t1][t2]=1;
} //设置障碍点为1
vis[x][y]=1;//起点标记已经走过
dfs(1,x,y);
cout<<ans;//输出方案数
return 0;
}