du熊正在玩一个别人刚送给它的机器人。这个机器人只能在一个棋盘中行走,棋盘的左上角格子为(0, 0),右下角格子为(X, Y)。
du熊控制这个机器人从棋盘的左上角,走到右下角,再从右下角回到左上角。当机器人从左上角走到右下角的过程中,如果它当前所在格子为(x, y),则它只能走到(x+1, y)或(x, y+1)的格子;当机器人从右下角走回左上角的过程中,如果它当前所在的格子为(x, y),则它只能走到(x-1, y)或(x, y-1)的格子。并且du熊要求机器人从左上角走到右下角再走回左上角的整个过程中,最多经过同一个格子一次。
请你帮du熊计算出这个机器人一共有多少种不同的路线。
-------------------------------------------------------------------------------------------------------------------------------
暂时棋盘设为三行三列,总体思路就是先往终点走,走过的路标设为1。若到达了终点,就往起点走,走过的路设为2。
#include <stdio.h>
/*
allX :棋盘X总个数
allY :棋盘Y总个数
arr[][] :棋盘数组
sum : 总方法个数
*/
int allX=3;
int allY=3;
int arr[3][3];
int sum=0;
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(){
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;
}
}
这个是运行结果:
此时sum为 1
2 1 1
2 0 1
2 2 1
-----------------------
此时sum为 2
2 1 1
2 2 1
0 2 1
-----------------------
此时sum为 3
2 1 0
2 1 1
2 2 1
-----------------------
此时sum为 4
2 2 2
1 1 2
0 1 1
-----------------------
此时sum为 5
2 2 0
1 2 2
1 1 1
-----------------------
此时sum为 6
2 2 2
1 0 2
1 1 1
-----------------------
从左上角走到右下角再走回左上角,总共路线有:6种