P1002 [NOIP2002 普及组] 过河卒 【记搜】

洛谷 P1002 -> Click Hereios

题意

从地图左上角,只能朝下和朝右移动,问移动到地图右下角有多少条路径(中间有一些点不能通过(详情请见洛谷题面c++

思路

记忆化搜索spa

\(f[i][j]\) :点 \((i,j)\) 移动到右下角有多少条路径code

\((0,0)\) 开始向右向下搜索,若目标点 \(f\) 已经存在,直接返回便可ci

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;
}
相关文章
相关标签/搜索