信息奥赛一本通1196:踩方格

【题目描述】
有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设:

a、每走一步时,只能从当前方格移动一格,走到某个相邻的方格上;

b、走过的格子立即塌陷无法再走第二次;

c、只能向北、东、西三个方向走;

请问:如果允许在方格矩阵上走n步,共有多少种不同的方案。2种走法只要有一步不一样,即被认为是不同的方案。

【输入】
允许在方格上行走的步数n(n≤20)。

【输出】
计算出的方案数量。

【输入样例】
2
【输出样例】
7

//1196:踩方格
#include
using namespace std;
int d[3][2]={{0,-1},{1,0},{0,1}};//方向向左、向上、向右
int step=0;//记录走过的步数
int sum=0;//记录走n步的不同路径数方案总和 
int a[21][41];//所有的方块,人开始站在a[0][20]的位置
int n;
void zou(int i,int j)
{
	if(a[i][j]==0&&i<=20&&j>=0&&j<=40)//0表示这个方块没被走过,可以走 
	{
		a[i][j]=++step;//站在起始点a[0][20]位置时,step=1;表示已经走了1步了(其实这时候还没走,n=0,step=n+1)。 
		//++step,走的步数增加1 
		if(step==n+1) //比如n=1,从a[0][20]向左、向上、向右走一步,step=2;其实只不过从原点走了一步而已,step=n+1; 
			{
				sum++;//达到n步了,方案数加1,返回 
				a[i][j]=0;
			return;	
			}
	}
	else //碰到大于0的有数字标识的,表示这个方块上已经被走过,走过的方块不重走 
	{
		return;
	}
	for(int m=0;m<=2;m++) //先向左,再向上,再向右探索 
	{
		step=a[i][j]; //取得原来的方块上的步数 
		zou(i+d[m][0],j+d[m][1]);
	}
	a[i][j]=0;//向左、向上、向右三个方向都探索之后,将当前台阶初始化,退到当前方块的前一个方块,这个方块后面可以继续踩,以继续踩这个方块 
	return;
}
int main()
{

    cin>>n;
 	zou(0,20);//从第0行第20列位置开始出发,走n步。 
    cout<

你可能感兴趣的:(C++)