信息学奥赛一本通(C++)1196:踩方格

目录

1196:踩方格

【题目描述】

【输入】

【输出】

【输入样例】

【输出样例】

【解法】


1196:踩方格

时间限制: 1000 ms         内存限制: 65536 KB
提交数: 4780     通过数: 3149

【题目描述】

有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设:

a、每走一步时,只能从当前方格移动一格,走到某个相邻的方格上;

b、走过的格子立即塌陷无法再走第二次;

c、只能向北、东、西三个方向走;

请问:如果允许在方格矩阵上走n步,共有多少种不同的方案。2种走法只要有一步不一样,即被认为是不同的方案。

【输入】

允许在方格上行走的步数n(n≤20)。

【输出】

计算出的方案数量。

【输入样例】

2

【输出样例】

7

【解法】

1、深度优先搜索

//http://bailian.openjudge.cn/practice/4103/
#include <cstring>
#include <iostream>
using namespace std;

const int N = 20; //步数
int w[N + 1][2 * N + 1];

int dfs(int i, int j, int n)
{
	if (n <= 0)
	{//站在原地,1种走法
		return 1;
	}
	else //if (n > 0)
	{//可以往北、东、西三个方向走
		int m = 0;
		w[i][j] = 1;
		if (!w[i - 1][j])
		{//北
			m += dfs(i - 1, j, n - 1);
		}
		if (!w[i][j - 1])
		{//西
			m += dfs(i, j - 1, n - 1);
		}
		if (!w[i][j + 1])
		{//东
			m += dfs(i, j + 1, n - 1);
		}
		w[i][j] = 0;
		return m;
	}
}

int main()
{
	int n;

	cin >> n;
	memset(w, 0, sizeof(w));
	cout << dfs(n, n, n);
	return 0;
}

2、递归调用

//http://bailian.openjudge.cn/practice/4103/
//f(n)=f(n-1)+2*(f(n-2)+...+f(1)+f(0)+1);
#include <iostream>
using namespace std;
 
int f(int n)
{
	if (n <= 0)
	{//临界条件 
		return 1;
	}
	int m = f(n-1), s=1;	
	for(n-=2;n>=0;n--)
	{
		s+=f(n);
	}
	return m+2*s;
}

int main()
{
	int n;

	cin >> n;
	cout << f(n);
	return 0;
}

3、动态规划

//http://bailian.openjudge.cn/practice/4103/
//f(n)=f(n-1)+2*(f(n-2)+...+f(1)+f(0)+1);
#include <iostream>
using namespace std;

const int N=21;
int a[N]={0}; 

int f(int n)
{	
	if (n <= 0)
	{//临界条件 
		return 1;
	}
	a[0]=1;
	for(int i=1;i<=n;i++)
	{
		a[i]=a[i-1]+2;
		for(int j=0;j<i-1;j++)
		{
			a[i]+=2*a[j];
		}
	}
	return a[n];
}

int main()
{
	int n;

	cin >> n;	
	cout << f(n);
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章