1 条题解
-
0
思路
深搜模板题。我们需要判断如下情况:
- 坐标超出边界;
- 该点已被遍历过;
- 该点上有障碍;
以上情况均需返回。如果该点为目标点,则将答案计数器加一并返回。
如果以上情况均不成立,我们就标记为该点被遍历过,然后向四个方向递归,然后再回溯。
AC Code
#include<bits/stdc++.h> #define ll long long using namespace std; const ll N=10,M=15; ll n,m,t,sx,sy,fx,fy,ans; struct node{ ll x,y; }a[M]; bool flag[N][N]; void dfs(ll x,ll y){ if(x<1||y<1||x>n||y>m||flag[x][y]) // 超出边界或被遍历过 return; for(ll i=1;i<=t;i++) if(x==a[i].x&&y==a[i].y) return; // 该点上有障碍 if(x==fx&&y==fy){ // 该点为目标点 ans++; return; } flag[x][y]=1; // 记忆化 dfs(x+1,y),dfs(x-1,y),dfs(x,y+1),dfs(x,y-1); flag[x][y]=0; // 回溯 } int main(){ scanf("%lld%lld%lld%lld%lld%lld%lld",&n,&m,&t,&sx,&sy,&fx,&fy); for(ll i=1;i<=t;i++) scanf("%lld%lld",&a[i].x,&a[i].y); dfs(sx,sy); printf("%lld",ans); return 0; }
- 1
信息
- ID
- 745
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 3
- 标签
- 递交数
- 85
- 已通过
- 48
- 上传者