作业帮 > 综合 > 作业

马拦过河卒 C语言特别经典的递如图,A 点有一个过河卒,需要走到目标 B  点.卒行走规则:可以向下、或者向右

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/22 11:53:55
马拦过河卒 C语言
特别经典的递

图,A 点有一个过河卒,需要走到目标 B  
点.卒行走规则:可以向下、或者向右.同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点.例
如上图 C  点上的马可以控制 9 个点(图中的P1,P2 … P8 和 C).卒不能通过对方马的控制点.

  棋盘用坐标表示,A 点(0,0)、B 点(n,m)(n,m 为不超过 20 的整数,并由键盘输入),同样马的位置坐标是需要给出的(约定: C<>A,同时C<>B).现在要求你计算出卒从 A 点能够到达 B 点的路径的条数.
输入格式
  四个整数 分别表示B点的坐标(n,m)以及对方马的坐标(X,Y){不用判错}
输出格式
  一个整数(路径的条数).
样例输入
6 6 3 2
样例输出
17

能帮我看看哪错了么.能过例子,提交的时候是一组数据正确,两组数据超时,两组数据错误.
#include <stdio.h>
int map[21][21]={0};
int n,m,x,y;

int main(){
    int i,j;
    long long count;
    long long way(int x1,int y1);
    scanf("%d%d%d%d",&n,&m,&x,&y);
    
    for(i=0;i<=n;i++)
    {
        for(j=0;j<=m;j++)
        {
            map[i][j]=1;
        }
    }
    map[x][y]=0;
    map[x-1][y-2]=0;
    map[x-1][y+2]=0;
    map[x+1][y-2]=0;
    map[x+1][y+2]=0;
    map[x-2][y-1]=0;
    map[x-2][y+1]=0;
    map[x+2][y-1]=0;
    map[x+2][y+1]=0;
    count=way(n,m);
    
    printf("%lld",count);
    return 0;
    
}

long long way(int x1,int y1)
{
    long long result;
    
    if(map[x1][y1]==1)
    {
        if(y1==0&&x1>0)
        {
            result=way(x1-1,0);
        }
        if(x1==0&&y1>0)
        {
            result=way(0,y1-1);
        }
        if(x1>0&&y1>0)
        {
            result=way(x1-1,y1)+way(x1,y1-1);
        }
        if(x1==0&&y1==0)
        {
            result=1;
        }
    }
    else
    {
        result=0;
    }
    return(result);
}
把下面这段检查下,x-1,x-2,y-1,y-2是否有越界?
map[x][y]=0; map[x-1][y-2]=0; map[x-1][y+2]=0; map[x+1][y-2]=0; map[x+1][y+2]=0; map[x-2][y-1]=0; map[x-2][y+1]=0; map[x+2][y-1]=0; map[x+2][y+1]=0;
再问: 恩。我按照你说的,多设置了几个if 保证那些个数组不越界。现在是两组数据成功,三组数据超时。。按理说我用的递归公式应该不会导致超时啊
再答: 如果只是超时,说明数据运算量大的问题,优化下程序吧,比如说改成如下这段,可能会有帮助。long long way(int x1,int y1)    
{
    if(map[x1][y1])
    {
        if(!y1 && x1 )return way(x1-1,0);
        if(!x1 && y1 ) return way(0,y1-1);
        if(x1 && y1 ) return way(x1-1,y1)+way(x1,y1-1);
        if(!x1  && !y1 )return 1;
      }
    else    return 0;
} 如果还超时,那就彻底改算法吧,可以用动态规划(Dynamic Programming)来做,下面代码供参考,(dp看不懂的话上网baidu下)//DP
unsigned long f[21]={0};
/边界 
    f[0]=1;
    i=1;
    while(map[0][i]&&i<=m)
        f[i++]=1;
    for(i=1;i<=n;i++)
    {
        if(!map[i][0])f[0]=0;
        for(j=1;j<=m;j++)
            if(map[i][j])
                f[j]=f[j]+f[j-1];
            else f[j]=0;
    }