刚上洛谷,看到这样一题:
题目描述
棋盘上 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考虑学下各种算法再重新做一遍。