本题答案为原创.....
首先,做这题你得会DFS,我就不多说了,后面可能会出,现在去找别的博主先吧.....
好了,废话不多说,直接上代码好吧....C++代码如下
点个赞给个关注吧QwQ求求了.
//本题博主使用的时C++语言
#include<bits/stdc++.h>//头文件,个人喜欢用
using namespace std;
int n,m,t;//不用讲吧....
int a[1005][1005],vis[1005][1005];//定义的地图数组和用来记录的visit数组
int dx[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//位移数组,我个人喜欢放在一个二维数组里
/*
int dx[4]={1,-1,0,0};//不喜欢用二维数组的可以用一维数组,但下面DFS中的xx和yy也要修改
int dy[4]={0,0,1,-1};
*/
int sx,sy,fx,fy;//出发结束x,y点
int ans=0;//记录有几条路可以走
void DFS(int x,int y)//DFS整体
{
if(x==fx&&y==fy)//判断是否到达终点
{
ans++;//记录
return ;//退出本次递归函数
}
for(int i=0;i<=4-1;i++)//位移开始
{
int xx=x+dx[i][0];//移动后的x点
int yy=y+dx[i][1];//移动后的y点
/*
int xx=x+dx[i];//一维数组的位移
int yy=y+dy[i];
*/
if(xx<=0||x>n||y<=0||yy>m)//判断是否跳出地图边界
{
continue;
}
if(vis[xx][yy]==1)//判断是否走过
{
continue;
}
if(a[xx][yy]==1)//判断是否是障碍
{
continue;
}
vis[xx][yy]=1;//记录这条路走过了
DFS(xx,yy);//递归,前往下一层
vis[xx][yy]=0;//回溯,以备下一次用,不然的话在下一次走到这时会发现在之前走过了
}
}
int main()
{
memset(a,0,sizeof(a));//把a数组全部归零,目前地图都可以走
cin>>n>>m>>t;//输入不用多说了吧....
cin>>sx>>sy>>fx>>fy;
for(int i=1;i<=t;i++)
{
int tx,ty;
cin>>tx>>ty;
a[tx][ty]=1;//把障碍部分设为1,让它不可走
}
vis[sx][sy]=1;//要把起点设为1,不然会又走回来
DFS(sx,sy);//函数
cout<<ans<<endl;//最后输出....
return 0;//大功告成!
}