您的位置:首页 > 其它

递推递归练习 中的L题

2017-04-01 19:35 190 查看
题意就是求点从(0,0)坐标向右向下走到给定坐标的路线。给定马的坐标是一个无法通过的障碍,其周围有8个点无法通过。

思路:走到点(i,j)的路线数为a[i][j]=a[i-1][j]+a[i][j-1];想到这一点就差不多了。用数组a存路线数,数组b判断障碍。注意边界条件,a[i][j]即为总路线数。

代码如下:

 #include<iostream>

using namespace std;

long long a[16][16],b[5],n;

void getrabbit(long long  a[16][16],long long b[5])

{int i,t=1,j,y,m,x;

for (i=0;i<16;i++)

for (j=0;j<16;j++) {  a[i][j]=-1;}

a[b[2]][b[3]]=0;

if (b[2]-1>=0&&b[3]-2>=0) a[b[2]-1][b[3]-2]=0;

if (b[2]-2>=0&&b[3]+1<=b[1]) a[b[2]-2][b[3]+1]=0;

if (b[2]-2>=0&&b[3]-1>=0) a[b[2]-2][b[3]-1]=0;

if (b[2]-1>=0&&b[3]+2<=b[1]) a[b[2]-1][b[3]+2]=0;

if (b[2]+1<=b[0]&&b[3]-2>=0) a[b[2]+1][b[3]-2]=0;

if (b[2]+2<=b[0]&&b[3]-1>=0) a[b[2]+2][b[3]-1]=0;

if (b[2]+1<=b[0]&&b[3]+2<=b[1]) a[b[2]+1][b[3]+2]=0;

if (b[2]+2<=b[0]&&b[3]+1<=b[0]) a[b[2]+2][b[3]+1]=0;

a[0][0]=1;

for (i=0;i<=b[0];i++)

for (j=0;j<=b[1];j++)

{if (i==0&&j==0) continue;

else {if (a[i][j]==0) continue;

if (i==0) a[i][j]=a[i][j-1];

else if (j==0) a[i][j]=a[i-1][j];

else a[i][j]=a[i-1][j]+a[i][j-1];

}

}

}

int main()

{

long long n,x,j,i;

while (cin>>b[0]>>b[1]>>b[2]>>b[3])

{ getrabbit(a,b);

cout<<a[b[0]][b[1]]<<endl;}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm 动态规划