[洛谷P1002]过河卒不完美解1

刚上洛谷,看到这样一题:
题目描述

棋盘上 AAA 点有一个过河卒,需要走到目标 BBB 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 CCC 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。

棋盘用坐标表示, AAA 点 (0,0)(0, 0)(0,0) 、 BBB 点 (n,m)(n, m)(n,m) ( nnn , mmm 为不超过 202020 的整数),同样马的位置坐标是需要给出的。

现在要求你计算出卒从 AAA 点能够到达 BBB 点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。

输入输出格式

输入格式:
一行四个数据,分别表示 BBB 点坐标和马的坐标。

输出格式:
一个数据,表示所有的路径条数。

输入输出样例

输入样例#1:
6 6 3 3
输出样例#1:
6

然后一想觉得不难,仿佛递归深搜就能解决。于是兴冲冲的直接写下如下程序:

/*过河卒*/
#include
int gx,gy;
long long rcount=0;
int cox[10]={-1,-1,1,1,-2,-2,2,2,0};
int coy[10]={2,-2,2,-2,-1,1,-1,1,0};
int main()
{
    int a,b,c,d;
    scanf("%d%d%d%d",&a,&b,&c,&d);
    gx=a,gy=b;
    //printf("\n%d,%d",gx,gy);
    for(int i=0;i<9;i++)
    {
        cox[i]=cox[i]+c;
        coy[i]=coy[i]+d;
    }
    long long findway(int a,int b);
    printf("%lld",findway(0,0));
}
/*判断马的控制点*/ 
bool ifCtrld(int x,int y)
{
    for(int i=0;i<9;i++)
    {
        if(cox[i]==x)
        {
            if(coy[i]==y)
            {
                return true;
            }
        }
    }
    return false;
}
/*寻路起点*/ 
long long findway(int a,int b)
{
    int gost(int x,int y);
    int gort(int x,int y);
    gost(a,b);
    gort(a,b);
    return rcount;
}
/*两种情况*/ 
int gost(int x,int y)
{
    x++;
    //printf("go stright to:%d,%d\n",x,y);
    int gost(int X,int Y);
    int gort(int X,int Y);
    bool ifCrtld(int X,int Y);
    if(ifCtrld(x,y))
    return 0;
    else if(x==gx&&y==gy)
    {
        rcount++;
      // printf("%lld\n",rcount);
        return 0;
    }else if(x>gx||y>gy)/*判断边界*/ 
    {
        return 0;
    }else{
        gost(x,y);
        gort(x,y);
    }

}
int gort(int x,int y)
{
    y++;
   //printf("go right to:%d,%d\n",x,y);
    int gost(int X,int Y);
    int gort(int X,int Y);
    bool ifCrtld(int X,int Y);
    if(ifCtrld(x,y))
    return 0;
    else if(x==gx&&y==gy)
    {
        rcount++;
        //printf("%lld\n",rcount);
        return 0;
    }else if(x>gx||y>gy)
    {
        return 0;
    }else{
        gost(x,y);
        gort(x,y);
    }
}

当时想法:我让马向前走,然后有两种情况。然后每种情况又有两种情况,如此下去直到边界或终点。完成深度优先搜索

但是有一个问题:这种方法效率并不高,当数据大于15时就会明显耗时,以至于三组tle考虑学下各种算法再重新做一遍。

你可能感兴趣的:([洛谷P1002]过河卒不完美解1)