过河卒 ----递推

#include<stdio.h> 
#define M  17
#define N  17
void main()
{
int m,n,x,y,tx,ty,i,j;        //m,n 是B坐标,x,y 是马的位置坐标 
printf("请按次序输入点B和马点的坐标\n");
scanf("%d%d%d%d",&n,&m,&x,&y);

int dx[]={2,1,-1,-2,-2-1,1,2};    //马 控制的九个点 
int dy[]={1,2,2,1,-1,-2,-2,-1};
int g[N][M],f[N][M];     //棋盘大小声明 

for(i=0;i<=n;i++)       //n,m 就是坐标值 
{
 for(j=0;j<=m;j++)
 {
  f[i][j]=0;            //到达每一点的方法初始化为0; 
  g[i][j]=1;             //假设每一点可到达 
 }  
}

g[x][y]=0;           //马的位置点 为不可到达
 
//将马的八个控制点更改为为不可到达
for(i=0;i<8;i++)
{  
 tx=x+dx[i];   
 ty=y+dy[i];
 
 if(tx>=0&&ty>=0&&tx<=n&&ty<=m)  //是否越界(超出棋盘) 
    g[tx][ty]=0;       
}


//递推的初始值确定:起点   最左边   最上边  共三条路径                    
if(g[0][0]==1)                     
   f[0][0]=1; 
 
for(i=1;i<=n;i++) 
{  
  if(g[i][0]==1)
  {
  f[i][0]=f[i-1][0];
  }
}  
for(j=1;j<=m;j++)
{  
  if(g[0][j]==1)
  {
  f[0][j]=f[0][j-1];
  }
}  


//开始递推求和
for(i=1;i<=n;i++)         //下标是从1开始的,不是0; 
{
 for(j=1;j<=m;j++)
 {
  if(g[i][j]==1)
    f[i][j]=f[i][j-1]+f[i-1][j];   
 }  
}

printf("THE FINAL RESULT IS %d\n",f[n][m]);

}

猜你喜欢

转载自blog.csdn.net/qq_37040173/article/details/68958064