百练4103 踩方格

题意:有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设:
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;
}


你可能感兴趣的:(百练4103 踩方格)