从(0,0)到(m,n)有多少种路径?
- 题目
从(0,0)到(m,n),每次走一步,只能向上或者向右走,有多少种路径走到(m,n) - 思路:
递归的思想,在当前路径下,要么向右,要么向上,两种选择。
//#include"stdafx.h"
#include<iostream>
#include<algorithm>
#include<time.h>
#define Max 1000
int path[Max][2];
int m, n;
using namespace std;
//路径输出
void print_path(int index) {
int i;
for (i = 0; i < index; i++)
printf("(%d,%d)->", path[i][0], path[i][1]);
printf("(%d,%d)\n", path[i][0], path[i][1]);
}
//搜索算法:递归的思想,当前路径要么向右,要么向上
void fun(int x, int y, int index,int &count) {
path[index][0] = x;
path[index][1] = y;
if (x == m && y == n) {
count++;
print_path(index);
return;
}
else if (x > m || y > n)
return;
fun(x + 1, y, index + 1, count);
fun(x, y + 1, index + 1, count);
}
int main() {
int count = 0;
//cin >> m >> n;
while (cin >> m >> n) {
fun(0, 0, 0, count);
cout << count << endl;
count = 0;//循环输出,就要每次将count初始化=0
}
//getchar();
return 0;
}
- 测试结果如下
一般规律:
从A到B,不管其如何走,必然要经过m+n个格子。然后这m+n个格子里面只有两种状态,向上或向右;而且为到达B,必须有n个向右走,m个向上走;如此,从这m+n个格子里选择n个向右走就ok了(剩下的就向上走,当然可以选择m向上走,剩下向右走)。
答案就是:(0,0)–>(m,n)
另外:
如果当棋盘中出现了P(k,h)
不能走的情况:那么就分步骤;先算没有P有多少种假设为:M;算出(0,0)
到P
有m1
种;然后算出P
到(m,n)
有m2
种;用M-(m1*m2)
;就是最后的种数;
即是说:用总的数目减去必须经过P的路径,就是不需要经过P的路径和。