题目链接:http://acm.ocrosoft.com/problem.php?cid=1222&pid=13
题目描述
有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设:
a.每走一步时,只能从当前方格移动一格,走到某个相邻的方格上;
b.走过的格子立即塌陷无法再走第二次;
c.只能向北、东、西三个方向走;
请问:如果允许在方格矩阵上走n步,共有多少种不同的方案。2种走法只要有一步不一样,即被认为是不同的方案。
输入
允许在方格上行走的步数n(n≤20)。
输出
计算出的方案数量。
样例输入
2
样例输出
7
dfs
#include<bits/stdc++.h>
using namespace std;
int n;
bool vis[222][222];
int ans=0;
int dir[3][2]={{1,0},{-1,0},{0,1}};
void dfs(int x,int y,int sum){
if(sum==n){
ans++;
return;
}
for(int i=0;i<3;i++){
int xx=x+dir[i][0];
int yy=y+dir[i][1];
if(vis[xx][yy]==0){
vis[xx][yy]=1;
dfs(xx,yy,sum+1);
vis[xx][yy]=0;
}
}
}
int main(){
while(cin>>n){
ans=0;
vis[0][0]=1;
dfs(0,0,0);
cout<<ans<<endl;
}
return 0;
}
动态规划,递推找规律
n=1时有三个方向可以走,n=2时有7种走法,走三步以上:a[i]=a[i-1]*2+a[i-2];
a[i]=a[i-1]+a[i-2]*2+(a[i-1]-a[i-2]);
a[i-1]表示向北走,a[i-2]表示上一步是往北走过来的,那么这次东西都可以走,
a[i-1]-a[i-2] 表示上一步是从东西方向走过来的,那么只有一种走法向东或向西
#include <iostream>
using namespace std;
int n;
int a[22];
int main(){
while(cin>>n){
a[0]=0;
a[1]=3;
a[2]=7;
for(int i=3;i<=n;i++){
a[i]=a[i-1]*2+a[i-2];
}
cout<<a[n]<<endl;
}
return 0;
}