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