想象一下,机器人坐在NxN网格的左上角。机器人只能向三个方向移动:向右,向下和对角向下。机器人必须到达NxN网格的右下角。想象一下,某些方块是“禁区”或“偏移”,这样机器人就无法踩到它们。编写程序以确定机器人的可能路径数。
这是我的代码:
#include<stdio.h>
#include<string.h>
int abc[50]={}, count=0;
int ak[5][5];
void called(int a,int b,int c){
if(a==c-1 && b==c-1){
int i=0;
printf("( 0 , 0 ) - ");
for(i=0;i<count;i+=2){
if(i==count-2)
printf("( %d , %d )",abc[i],abc[i+1]);
else
printf("( %d , %d ) - ",abc[i],abc[i+1]);
}
printf("\n");
abc[count--]=-1;
abc[count--]=-1;
return;
}
else{
if(a!=c-1 && ak[a][b]!=1){
abc[count++]=a+1;
abc[count++]=b;
called(a+1,b,c);
}
if(b!=c-1 && ak[a][b]!=1){
abc[count++]=a;
abc[count++]=b+1;
called(a,b+1,c);
}
if(a!=c-1 && a!=c-1 && ak[a][b]!=1){
abc[count++]=a+1;
abc[count++]=b+1;
called(a+1,b+1,c);
}
abc[count--]=-1;
abc[count--]=-1;
}
}
void main(){
int a,b,i,j,n;
printf("Enter the size of the grid\n");
scanf("%d",&n);
if(n>=0){
for(i=0;i<n;i++)
for(j=0;j<n;j++)
ak[i][j]=0;
printf("Enter the grid points that are offsets\n");
scanf("%d",&a);
scanf("%d",&b);
while(a!=-1 && b!=-1){
ak[a][b]=1;
scanf("%d",&a);
scanf("%d",&b);
}
printf("The paths for the robot are\n");
called(0,0,n);
}
else
printf("Invalid Input");
getchar();
}
在运行时,弹出一个错误 -
Program terminated due to "Segmentation fault" (11)
答案 0 :(得分:0)
您将网格大小作为输入,但您还将其硬编码为5 * 5.如果用户尝试输入的数字大于5,则程序应该因“分段错误”而崩溃。
答案 1 :(得分:0)
最好的解决方案是将此问题编码为图形,方法是为网格的每个单元格分配一个唯一的ID,然后构建一个adiacence列表或一个邻接矩阵(如果图形密集 - 有很多边缘 - 更喜欢列表中的矩阵。)
通过这种方式,您可以使用最优的预先存在的图算法来查找所述图中两个顶点之间的所有路径的数量。
答案 2 :(得分:0)
为nxn网格得出的公式I:(2n)!/ [((n!)(n!)]]用英语:2n阶乘除以n阶乘平方。 mxn网格的公式:(m + n)!/(m!n!) 对于nxn网格r 来到帕斯卡的三角。答案是中间的数字,即1、2、6、20等。