从(0,0)到(m,n)有多少种路径,棋盘问题

从(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)Pm1种;然后算出P(m,n)m2种;用M-(m1*m2);就是最后的种数;
即是说:用总的数目减去必须经过P的路径,就是不需要经过P的路径和。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值