马拦过河卒问题 (递推解法)
2014-07-02 09:10
204 查看
过河卒(NOIP2002初中组复赛第四题)
问题描述: 棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下或向右。 同时在棋盘上的任一点有一个对方的马(如图中的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点。例如图中C点上的马可以控制9个点。卒不能走到对方马的控制点。 棋盘用坐标表示,A点坐标(0,0)、B点坐标(n, m) (n,m为不超过20的整数,并由键盘输入),同样马的位置坐标C是需要给出的(C≠A,且C≠B)。现在要求你计算出卒从A点能够到达B点的路径条数。
输入:B点的坐标(n, m)以及对方马的坐标(x,y),不用判错。
输出:一个整数(路径的条数)。
样例:
8 6 0 4
1617
10 10 4 4
6802
14 16 7 5
39217645
思路:step
[m]=step[n-1][m]+step
[m-1];
#include<stdio.h> #include<string.h> int map[110][110]; int step[110][110]; int main() { int n,m,x,y; int dx[]={2,1,-1,-2,-2,-1,1,2}; int dy[]={1,2,2,1,-1,-2,-2,-1}; while(~scanf("%d%d%d%d",&n,&m,&x,&y)) { memset(map,0,sizeof(map)); memset(step,0,sizeof(step)); int i,j; for(i=0;i<=n;i++) for(j=0;j<=m;j++) { map[i][j]=1; step[i][j]=0; } map[x][y]=0; int tx,ty; for(i=0;i<8;i++) { tx=x+dx[i]; ty=y+dy[i]; if(tx>=0&&ty>=0&&tx<=n&&ty<=m) map[tx][ty]=0; } if(map[0][0]) step[0][0]=1; for(i=1;i<=n;i++) if(map[i][0]) step[i][0]=step[i-1][0]; for(j=1;j<=m;j++) if(map[0][j]) step[0][j]=step[0][j-1]; for(i=1;i<=n;i++) for(j=1;j<=m;j++) if(map[i][j]) step[i][j]=step[i-1][j]+step[i][j-1]; printf("%d\n",step [m]); } return 0; }
相关文章推荐
- 人狼羊菜过河问题的解法及代码
- 约瑟夫环问题--递推解法
- 约瑟夫问题(Josephus问题)的递推O(n)解法、循环解法、单循环链表解法
- 过河问题的递归解法
- LA 3882 经典约瑟夫环问题的数学递推解法
- 过河问题的图论解法
- 某取数问题的递推解法
- 过河问题_纪中2558_递推
- 皇后问题的一个解法
- 寻找必败态:博弈问题的快速解法
- 一个问题的多种解法:
- 同一问题的两种不同解法 : MFC8.0 与 C++ 标准库
- 背包问题 顺推解法
- josephus问题的解法
- 0/1背包问题解法
- 微软过桥问题的图论解法
- Hanoi(汉诺)问题的非递归解法
- 称球问题的测试解法
- 字符串、汉字的拆分问题的解法
- 猫吃老鼠问题的单链表解法.