问题描述:在棋盘上A点位置(0,0)有一个过河卒,需要到达B点(N,M),在C点位置有一个马阻拦卒,所以卒不能路过C点以及马能一步到达的位置。卒只进行向下和向右操作,棋盘坐标与数学里第四象限不同,现假设棋盘下方坐标都为正。求到达B点路线数量。
解析:设A点到棋盘中某一点(i,j)的路线数量为a(i,j).而能一步到达(i,j)的点只有两个,分别是上面点(i-1,j),左边点(i,j-1),那么要到(i,j)要么是先到上面点(i-1,j)然后走一步到达(i,j),要么先到左边点(i,j-1)再走一步到达(i,j),所以到达(i,j)的路线数量就会是到达上面点(i-1,j)和到达左边点(i,j-1)这两个的路线之和。那么我们可以得到一个关系式,
a(i,j)=a(i-1,j)+a(i,j-1);
同时注意不能路过马所在位置以及马一步到达的位置。那么这些位置的路线数量就是0。这些位置有什么特点呢,马一步到达的位置与马的距离都是,假设马的坐标是(k,g),那么我们可以得到如果一个位置(i,j)与(k,g)的距离的平方是5,那么a(i,j)=0;,同样的如果(i,j)等于((g,k),啊(i,j)也等于0;
伪代码:
输入C点坐标k,g,输入B点坐标n,m,
for(i=0;i<=n;i++)
a[i][0]=1;//将边缘先置为1,因为边缘都只有一条路到达
for(j=0;j<=m;j++)
a[0][j]=1;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if( ((i-k)*(i-k)+(j-g)*(j-g)==5)||(i==k&&j==g) )
a[i][j]=0;
else
a[i][j]=a[i-1][j]+a[i][j-1];
最后,a[n][m]就是到达B点的路线数量。
点个赞呗!