机器人问题

题目一个机器人,从左上角走到右下角,问共有几种路径?

解法一:递归

int findpath(int i, int j, int n)
{
	if (i==n == 1 && j==n== 1)
		return 1;
	if (i == n || j == n)
		return 1;
	if (i > n || j > n)
		return 0;
	return findpath(i + 1, j, n) + findpath(i, j + 1, n);
}

解法二:记忆递归

long int mfindpath(int i, int j, int n)
{
	if (b[i][j] != -1)
		return b[i][j];
	if (i == n == 1 && j == n == 1)
	{
		b[i][j] = 1;
		return b[i][j];
	}
	if (i == n || j == n)
		return 1;
	if (i > n || j > n)
		return 0;
	b[i][j] = mfindpath(i + 1, j, n) + mfindpath(i, j + 1, n);
	return b[i][j];
}

解决三:dp

int dp(int n)
{
	b[n][n] = 1;
	for (int i = 1; i <= n - 1; i++)
	{
		b[n][i] = 1;
		b[i][n] = 1;
	}
	for (int i = n - 1; i >= 1; i--)
		for (int j = n - 1; j >= 1; j--)
			b[i][j] = b[i + 1][j] + b[i][j + 1];
	return b[1][1];

}

完整代码:

#include<iostream>
#include<Windows.h> 
using namespace std;
#define max 1000
int a[max][max];
long int b[max][max];
int findpath(int i, int j, int n)
{
	if (i==n == 1 && j==n== 1)
		return 1;
	if (i == n || j == n)
		return 1;
	if (i > n || j > n)
		return 0;
	return findpath(i + 1, j, n) + findpath(i, j + 1, n);
}
long int mfindpath(int i, int j, int n)
{
	if (b[i][j] != -1)
		return b[i][j];
	if (i == n == 1 && j == n == 1)
	{
		b[i][j] = 1;
		return b[i][j];
	}
	if (i == n || j == n)
		return 1;
	if (i > n || j > n)
		return 0;
	b[i][j] = mfindpath(i + 1, j, n) + mfindpath(i, j + 1, n);
	return b[i][j];
}
int dp(int n)
{
	b[n][n] = 1;
	for (int i = 1; i <= n - 1; i++)
	{
		b[n][i] = 1;
		b[i][n] = 1;
	}
	for (int i = n - 1; i >= 1; i--)
		for (int j = n - 1; j >= 1; j--)
			b[i][j] = b[i + 1][j] + b[i][j + 1];
	return b[1][1];

}
void main()
{
	DWORD start_time = GetTickCount();
	for (int n = 1; n <= 100; n++)
	{
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= n; j++)
				b[i][j] = -1;
		cout << "n=" << n << " : " << mfindpath(1, 1, n) << endl;
	}
	DWORD end_time = GetTickCount();
	cout << "The run time is:" << (end_time - start_time) << "ms!" << endl;
	cout << "--------------" << endl;
     start_time = GetTickCount();
	for (int n = 1; n <= 100; n++)
	{
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= n; j++)
				b[i][j] = -1;
		cout << "n=" << n << " : " << dp(n) << endl;
	}
     end_time = GetTickCount();
	cout << "The run time is:" << (end_time - start_time) << "ms!" << endl;
	system("pause");
}
发布了98 篇原创文章 · 获赞 1 · 访问量 4498

猜你喜欢

转载自blog.csdn.net/weixin_40823740/article/details/103123878