目錄
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;
}