题意:有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设:
a. 每走一步时,只能从当前方格移动一格,走到某个相邻的方格上;
b. 走过的格子立即塌陷无法再走第二次;
c. 只能向北、东、西三个方向走;
请问:如果允许在方格矩阵上走n步,共有多少种不同的方案。2种走法只要有一步不一样,即被认为是不同的方案。
思路:糊里糊涂想也没想写了个dfs,居然在百练上过了。后来仔细一想,动归或者说递推很容易想啊。(当然数据如果很大的话要处理大数问题)
#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <cstdlib> #define min(a,b) ((a)<(b)?(a):(b)) #define max(a,b) ((a)>(b)?(a):(b)) using namespace std; #define INF 0x3fffffff #define N 25 int flag[25][55],res=0,n; int ori[3][2] = {{1,0},{0,-1},{0,1}}; void dfs(int d,int x,int y){ int i; if(d == n){ res++; return; } for(i = 0;i<3;i++){ int xx = x+ori[i][0]; int yy = y+ori[i][1]; if(!flag[xx][yy]){ flag[xx][yy] = 1; dfs(d+1,xx,yy); flag[xx][yy] = 0; } } } int main(){ //freopen("a.txt","r",stdin); scanf("%d",&n); memset(flag,0,sizeof(flag)); flag[0][20] = 1; dfs(0,0,20); printf("%d\n",res); return 0; }