传送门https://www.luogu.com.cn/problem/P1605
这道题很明显是一个dfs的问题
这道题首先要在主函数里完成建造迷宫
但在建造迷宫之前,你要把所有的位置标为可以去
memset(a,'.',sizeof(a));
他给你了下标,所以你就可以直接建造迷宫,代码如下
for(int i=1;i<=T;i++){
cin>>xx>>yy;
a[xx][yy]='#';
}
不放心可以打一遍输出,最后要记得删掉哦( •̀ ω •́ )y
后面可以把起始点和终点在a数组中标记一下,再把起始点标1,代表来过了
a[sx][sy]='S';
a[fx][fy]='F';
vis[sx][sy]=1;
你还要第一个方向数组,让你可以上下左右的移动(改变坐标)
int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
下面就可以进入dfs之中了
首先是dfs的出口,很简单就是下标为重点的下标即可
if(x==fx&&y==fy){
ans++;//可行路线+1
return ;
}
下面就改变路线(移动)
有4种方向可以走,为上,下,左,右
int nx=x+dx[i],ny=y+dy[i];
判断一下他是否可以走
if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&a[nx][ny]!='#'&&vis[nx][ny]==0)
//是不是在迷宫之中,是不是障碍,来没来过
如果是的话,就把这个位置标1,代表来过,在进入那个点看看,最后还不要忘了要回溯,因为他又回来了,也就没有走过这个点
vis[nx][ny]=1;
dfs(nx,ny);
vis[nx][ny]=0;
最后,附上完整代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,T,sx,sy,fx,fy,xx,yy,vis[10][10],ans;
char a[10][10];
int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
void dfs(int x,int y){
if(x==fx&&y==fy){
ans++;
return ;
}
for(int i=0;i<4;i++){
int nx=x+dx[i],ny=y+dy[i];
if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&a[nx][ny]!='#'&&vis[nx][ny]==0){
vis[nx][ny]=1;
dfs(nx,ny);
vis[nx][ny]=0;
}
}
}
int main(){
cin>>n>>m>>T>>sx>>sy>>fx>>fy;
memset(a,'.',sizeof(a));
a[sx][sy]='S';
a[fx][fy]='F';
vis[sx][sy]=1;
for(int i=1;i<=T;i++){
cin>>xx>>yy;
a[xx][yy]='#';
}
dfs(sx,sy);
cout<<ans;
return 0;
}