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