ACM:马拦过河卒

l2061206 2012-10-11 10:18:12
Description

棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。
棋盘用坐标表示,A点(0, 0)、B点(n, m)(n, m为不超过15的整数),同样马的位置坐标是需要给出的。现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。

Input

一行四个数据,分别表示B点坐标和马的坐标。(保证所有的数据有解)

Output

一个数据,表示所有的路径条数。

Sample Input

6 6 3 3
Sample Output

6

希望有注释,谢谢
...全文
646 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
cfvmario 2012-10-11
  • 打赏
  • 举报
回复
就是抹去特定点而已 先求控制点
用递推就可以吧 还是每一点的条数等于左上二点的条数 控制点上的值恒为0 然后就是有个高精度加法问题
dpdp_2012 2012-10-11
  • 打赏
  • 举报
回复
以上if(check(m,n)==0)改为if(check(0,0)==0)、

DP版本

#include <stdio.h>

int m,n,x,y;

int abs(int a)
{
return a>0?a:-a;
}

bool check(int a,int b)
{
if(a==x&&b==y)
return 0;
if(abs(a-x)==1&&abs(b-y)==2 || abs(a-x)==2&&abs(b-y)==1)
return 0;
return 1;
}

int main()
{
int dp[16][16];
while(scanf("%d%d%d%d",&m,&n,&x,&y)!=EOF)
{
dp[0][0]=check(0,0);
for(int i=0;i<=m;i++)
for(int j=0;j<=n;j++)
{
if(i==0&&j==0)
continue;
if(check(i,j)==0)
dp[i][j]=0;
else
{
int a=0,b=0;
if(i>0) a=dp[i-1][j];
if(j>0) b=dp[i][j-1];
dp[i][j]=a+b;
}
}
printf("%d\n",dp[m][n]);

}
}
dpdp_2012 2012-10-11
  • 打赏
  • 举报
回复

#include <stdio.h>

int m,n,x,y;

int abs(int a)
{
return a>0?a:-a;
}

bool check(int a,int b)
{
if(a==x&&b==y)
return 0;
if(abs(a-x)==1&&abs(b-y)==2 || abs(a-x)==2&&abs(b-y)==1)
return 0;
return 1;
}

int dfs(int a,int b)
{
if(a==m&&b==n)
return 1;
if(a>m||b>n)
return 0;
if(check(a,b)==0)
return 0;
return dfs(a+1,b)+dfs(a,b+1);
}

int main()
{

while(scanf("%d%d%d%d",&m,&n,&x,&y)!=EOF)
{
int ans;
if(check(m,n)==0)
ans=0;
else
ans=dfs(0,0);
printf("%d\n",ans);
}
}
没有仔细测试过。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧