du熊机器人

Description
du熊正在玩一个别人刚送给它的机器人。这个机器人只能在一个棋盘中行走,棋盘的左上角格子为(0, 0),右下角格子为(X, Y)。
du熊控制这个机器人从棋盘的左上角,走到右下角,再从右下角回到左上角。当机器人从左上角走到右下角的过程中,如果它当前所在格子为(x, y),则它只能走到(x+1, y)或(x, y+1)的格子;当机器人从右下角走回左上角的过程中,如果它当前所在的格子为(x, y),则它只能走到(x-1, y)或(x, y-1)的格子。并且du熊要求机器人从左上角走到右下角再走回左上角的整个过程中,最多经过同一个格子一次。
请你帮du熊计算出这个机器人一共有多少种不同的路线。

这道题我用的是一个递归的思路,试过很多方法,解这种走路径的题目还是递归舒服,用0表示没走过的路,用1表示toEnd的路,用2表示了toStart的路,如果想看走的方法的可以将toStart函数的解法注释取消掉自己康康,就酱。
C代码如下:

/*
    递归思路解du熊问题
    样例输入:
    3
    1 1
    1 1000
    3 4
    样例输出:
    2
    2
    100
*/

#include <stdio.h>
/*
	allX :棋盘X总个数
	allY :棋盘Y总个数
	arr[][] :棋盘数组
	sum : 总方法个数
*/
int allX;
int allY;
int arr[1024][1024];
int sum;

bool isNextToEnd(int x,int y);
void toEnd(int x,int y);
bool isNextToStart(int x,int y);
void toStart(int x,int y);

int main(){
	int i,num,x,y;
	scanf("%d",&num);
	for(i = 0;i<num;i++)
	{
		/*
            首先要将sum初值设为0
            然后将棋盘的XY输入,但是输入的是右下角的坐标,
			所以数组下标要多加1
		*/
		sum = 0;
		scanf("%d",&x);
		scanf("%d",&y);
		allX = x+1;
		allY = y+1;
		toEnd(0,0);
		printf("总共路线有:%d种\n",sum) ;
	}
	
}


/*
	isNextToEnd(int x,int y) :是否能走这一步,即是否可以走到arr[x][y] ,这里是往终点走
	toEnd(int x,int y) :迭代走下一步,一直到终点
*/
bool isNextToEnd(int x,int y){
	if(x>=allX||y>=allY)return false;
	return true;
}
void toEnd(int x,int y){
	//如果已经走到终点,就往回走
	if(x==allX-1&&y==allY-1){
		toStart(x,y);
		return;
	}
	//先走右边
	if(isNextToEnd(x,y+1)){
		arr[x][y+1]=1;
		toEnd(x,y+1);
		arr[x][y+1]=0;
	}
	//再走下边
	if(isNextToEnd(x+1,y)){
		arr[x+1][y]=1;
		toEnd(x+1,y);
		arr[x+1][y]=0;
	}
}


/*
	isNextToStart(int x,int y) :是否可以走到arr[x][y],这里是往起点走
	toStart(int x,int y) :迭代走下一步,一直到起点
*/
bool isNextToStart(int x,int y){
	if(x<0||y<0||arr[x][y]==1)return false;
	return true;
}
void toStart(int x,int y){
	if(x==0&&y==0){

		sum++;
//      输出走法,检验用
//		printf("此时sum为 %d\n",sum);
//
//		for(int i=0;i<allX;i++){
//			for(int j=0;j<allY;j++)
//				printf("%d\t",arr[i][j]);
//			printf("\n");
//		}
//		printf("\n");
//		printf("-----------------------\n") ;
		return;
	}
	//先走左边
	if(isNextToStart(x,y-1)){
		arr[x][y-1]=2;
		toStart(x,y-1);
		arr[x][y-1]=0;
	}
	//再走上边
	if(isNextToStart(x-1,y)){
		arr[x-1][y]=2;
		toStart(x-1,y);
		arr[x-1][y]=0;
	}
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值