百练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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值