信息學奧賽一本通(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;
}

 

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