目录
题目总览
题目描述
给定一个 N×M 方格的迷宫,迷宫里有 T 处障碍,障碍处不可通过。
在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。
给定起点坐标和终点坐标,每个方格最多经过一次,问有多少种从起点坐标到终点坐标的方案。
输入格式
第一行为三个正整数 N,M,T,分别表示迷宫的长宽和障碍总数。
第二行为四个正整数 SX,SY,FX,FY,SX,SY 代表起点坐标,FX,FY 代表终点坐标。
接下来 T 行,每行两个正整数,表示障碍点的坐标。
输出格式
输出从起点坐标到终点坐标的方案总数。
输入输出样例
Input 1:
cpp
2 2 1
1 1 2 2
1 2
Output 1:
cpp
1
思路分析
经典DFS模版题,实在做不出来就看我的DFS讲解吧。
注意以下几点:
1.记得回溯
2.读入数据的顺序别读入错误
3.只有四个方向,并非八个方向
AC代码
cpp
#include<bits/stdc++.h>
using namespace std;
bool a[10][10];
bool vis[10][10]={0};
int n,m,t,sx,sy,fx,fy,ans=0,tx,ty;
int dx[4]={0,0,1,-1};
int dy[4]={-1,1,0,0};
void dfs(int x,int y)
{
if(x==fx&&y==fy)
{
ans++;
return;
}
vis[x][y]=true;
for(int i=0;i<=3;i++)
{
int nx=x+dx[i];
int ny=y+dy[i];
if(!vis[nx][ny]&&a[nx][ny]&&x>=1&&y>=1&&x<=n&&y<=m)
{
dfs(nx,ny);
}
}
vis[x][y]=false;
}
int main()
{
cin>>n>>m>>t>>sx>>sy>>fx>>fy;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
a[i][j]=true;
}
}
for(int i=1;i<=t;i++)
{
cin>>tx>>ty;
a[tx][ty]=false;
}
vis[sx][sy]=true;//起点为真
dfs(sx,sy);
cout<<ans<<endl;
return 0;
}