思路:直接用DFS搜索,要注意的是这个题是找起点坐标到终点坐标的方案数,所以我们在递归调用之后要记得还原标记数组,不然后面无法统计方案数。
#include <bits/stdc++.h>
using namespace std;
int n,m,t,sx,sy,fx,fy,ans=0;
int vis[10][10],mp[10][10];
int step_x[4] = {0,0,1,-1}; //方向数组
int step_y[4] = {1,-1,0,0};
void dfs(int x,int y){
if(x==fx&&y==fy){ //走到了结束的点
ans++;
return ;
}
for(int i=0;i<4;i++){
int xi = x + step_x[i];
int yi = y +step_y[i];
if(xi>0&&xi<=n&&yi>0&&yi<=m&&vis[xi][yi]!=1&&mp[xi][yi]!=1){
vis[xi][yi] = 1; //标记这个点走过了
dfs(xi,yi);
vis[xi][yi] = 0; //还原这个点
}
}
return ;
}
int main()
{
cin>>n>>m>>t;
cin>>sx>>sy>>fx>>fy;
for(int i=0;i<t;i++){
int x,y; cin>>x>>y;
mp[x][y] = 1;//标记障碍物
}
vis[sx][sy] = 1; //一定要记得把起点标记了,不标记后面可能会再次走到起点位置
dfs(sx,sy);
cout<<ans<<endl;
return 0;
}
/*
2 2 1
1 1 2 2
1 2
*/
可能我撞了南墙才会回头吧。可能我见了黄河才会死心吧…