#include<bits/stdc++.h>
using namespace std;
int n,m,t,sx,sy,fx,fy,res;//起点(sx,sy) 终点(fx,fy),总方案数res
int mp[15][15],v[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
bool st[15][15];
void dfs(int x,int y){
if(x==fx&&y==fy){//一旦走到终点,表面当前的走法可以走到终点,那么合法的方案数+1,并回溯到上一步(看看还有没有其他合法的方案)
res++;//方案数增加+1
return;
}
for(int i=0;i<4;i++){//遍历当前(x,y)点可以达到的合法位置
int tx=x+v[i][0],ty=y+v[i][1];
//检查tx,ty是否在合法区间,之前没有走过,并且不是石头
if(tx>=1&&tx<=n&&ty>=1&&ty<=m && st[tx][ty]==0 && mp[tx][ty]==0){
st[tx][ty]=1;//标记走过
dfs(tx,ty);
st[tx][ty]=0;//回溯后,尝试其他的走法(去往其他的tx,ty),那么先把当前的tx,ty重新标记没走过
}
}
}
int main()
{
cin>>n>>m>>t;
//输入起点 终点
cin>>sx>>sy>>fx>>fy;
//表示有t个石头
while(t--){
int x,y;
cin>>x>>y;
mp[x][y]=1;//mp[x][y]=1,表示坐标xy处有石头
}
st[sx][sy]=1;//标记起点已经走过
dfs(sx,sy);//对起点进行深度优先搜索
cout<<res<<endl;
return 0;
}
P1605 迷宫
最新推荐文章于 2024-09-27 14:28:55 发布