CODEVS 1010过河卒

来源:互联网 发布:淘宝一件代发怎么加入 编辑:程序博客网 时间:2024/05/16 02:09
#include<iostream>#include<string.h>using namespace std;int n,m,x,y,f[25][25],vis[25][25];int d(int a,int b){d(a,b)表示从(0,0)到(a,b)的路径总数,所以逆向递归,只能向上或向左    if(f[a][b]>=0) return f[a][b];    else if(a==0&&b==0) return 1;//走到终点总数加一    else{        int j=0,k=0;        if(a-1>=0&&vis[a-1][b]!=1) j=d(a-1,b);//判断是否合法,向上        if(b-1>=0&&vis[a][b-1]!=1) k=d(a,b-1);//判断是否合法,向左        return f[a][b]=(j+k);    }}int main(){    memset(f,-1,sizeof(f)); //初值不能赋0!!!    freopen("1010.in","r",stdin);    freopen("1010.out","w",stdout);    cin>>n>>m>>x>>y;    vis[x][y]=1;//标记马控制的9个位置,包括马自己!!!    if(x+1<=n&&y-2>=0) vis[x+1][y-2]=1;    if(x+2<=n&&y-1>=0) vis[x+2][y-1]=1;    if(x+2<=n&&y+1<=m) vis[x+2][y+1]=1;    if(x+1<=n&&y+2<=m) vis[x+1][y+2]=1;    if(x-1>=0&&y-2>=0) vis[x-1][y-2]=1;    if(x-2>=0&&y-1>=0) vis[x-2][y-1]=1;    if(x-2>=0&&y+1<=m) vis[x-2][y+1]=1;    if(x-1>=0&&y+2<=m) vis[x-1][y+2]=1;    cout<<d(n,m);    return 0;}

题解:记忆化搜索,d(a,b)表示从(0,0)到(a,b)的路径总数

0 0
原创粉丝点击