P1002 [NOIP2002 普及组] 过河卒 【记搜】
洛谷 P1002 -> Click Here
题意
从地图左上角,只能朝下和朝右移动,问移动到地图右下角有多少条路径(中间有一些点不能经过(详情请见洛谷题面
思路
记忆化搜索
\(f[i][j]\) :点 \((i,j)\) 移动到右下角有多少条路径
从 \((0,0)\) 开始向右向下搜索,若目标点 \(f\) 已经存在,直接返回即可
code
#include<iostream>
#include<map>
using namespace std;
typedef long long ll;//小坑点 开long long
ll n,m,my,mx;
map<ll,map<ll,ll> >mp;
ll f[1005][1005];
void init(){//不能经过的点
mp[my][mx]=1;
mp[my+2][mx+1]=1;
mp[my+2][mx-1]=1;
mp[my+1][mx+2]=1;
mp[my+1][mx-2]=1;
mp[my-1][mx+2]=1;
mp[my-1][mx-2]=1;
mp[my-2][mx-1]=1;
mp[my-2][mx+1]=1;
}
bool pan(ll y,ll x){
if(y<=n&&x<=m&&mp[y][x]==0) return true;
return false;
}
ll dfs(ll y,ll x){
if(f[y][x]) return f[y][x];//如果已经搜索过此点则直接返回此点的答案
if(pan(y+1,x)) f[y][x]+=dfs(y+1,x);//向下搜索
if(pan(y,x+1)) f[y][x]+=dfs(y,x+1);//向右搜索
return f[y][x];
}
int main(){
cin>>n>>m>>my>>mx;
init();
f[n][m]=1;//初始化右下角的点,以累加路径条数
dfs(0,0);
cout<<f[0][0]<<endl;
return 0;
}

浙公网安备 33010602011771号