大矩阵的问题

时间:2014-01-17 06:58:31

标签: c maze

我的任务是找到10X10迷宫中的最短路径。 我用N定义了大小,并在开始时尝试使用3X3和4X4大小进行调试以逐步检查,程序运行正常。 在此之后我试图放大尺寸,然后程序显示我这个并显示好像堆叠并且没有完成程序(最后我必须打印最短路径的值):

http://postimg.org/image/rsdzv3ugx/

这是我的代码。我不知道问题出在哪里。我不知道为什么3X3工作得很好而且更大的迷宫没有。

         #include <stdio.h>

#define N 7
#define UP 12
#define DOWN 20
#define RIGHT 30
#define LEFT 40

void paragraph_4 ();
int get2Dmatrix (int arr[N][N],int i,int j);
int maze (int maze_arr[N][N],int counter,int i,int j,int direction);
int min(int y1,int y2,int y3,int y4);

 int main ()
 {
    // int arr[10][10]={0};
    // get2Dmatrix (arr,0,0));
     paragraph_4();
     return 0;
 }

 void paragraph_4 ()
 {
     int maze_matrix[N][N];
     printf("Please enter information for 10 by 10 matrix\n");
     get2Dmatrix(maze_matrix,0,0);
     int min_length=maze (maze_matrix,0,0,0,DOWN);

     if (min_length==(N*N)+1)
         printf("No path\n");
     else
         printf("The shortest path length is %d\n",min_length-1);
 }

int get2Dmatrix (int arr[N][N],int i,int j)
{
    if (j==N)
    {
        i++;
        j=0;
    }
    if (i==N)
        return arr [N][N];

       scanf ("%d",&arr[i][j]);
        get2Dmatrix (arr,i,j+1);

    if (i==0 && j==0)
        return arr [N][N];

}

int maze (int maze_arr[N][N],int counter,int i,int j,int direction)
{
    int x1=(N*N)+1,x2=(N*N)+1,x3=(N*N)+1,x4=(N*N)+1;// initialization to impossible steps.
    counter++;

    if (i==(N-1) && j==(N-1))// stop recursion conditions
            return counter;

    if (counter==(N*N)+1)
        return ((N*N)+1);

    if ((i<(N-1)) && (direction!=UP) && (maze_arr[i+1][j]==1))// go down
        x1=maze(maze_arr,counter,i+1,j,DOWN);

    if ((i>0) && (direction!=DOWN) && (maze_arr[i-1][j]==1))//go up
        x2=maze(maze_arr,counter,i-1,j,UP);

    if ((j<(N-1)) && (direction != LEFT) && (maze_arr[i][j+1]==1))//go right
        x3=maze(maze_arr,counter,i,j+1,RIGHT);

    if ((j>0) && (direction!= RIGHT) && (maze_arr[i][j-1]==1))//go left
        x4=maze(maze_arr,counter,i,j-1,LEFT);

    return min(x1,x2,x3,x4);//send 4 numbers for function and return the

}

// Get 4 numbers and return the lowest value.
int min(int y1,int y2,int y3,int y4)
{
    if(y1==y2 && y2==y3 && y3==y4)
            return y1;
    else if (y1<=y2 && y1<=y3 && y1<=y4)
        return y1;
    else if (y2<=y1 && y2<=y3 && y2<=y4)
        return y2;
    else if (y3<=y1 && y3<=y2 && y3<=y4)
        return y3;
    else if (y4<=y1 && y4<=y2 && y4<=y3)
        return y4;
}

1 个答案:

答案 0 :(得分:0)

  1. 访问数组外部大小。另外:由于未使用get2Dmatrix()的返回值,只需返回。

    int get2Dmatrix (int arr[N][N],int i,int j) {
      ...
      if (i==N) return arr [N][N];  // access arr [N][N] is UB
    }
    
    void get2Dmatrix (int arr[N][N],int i,int j) {
      ...
      if (i==N) return;
    }
    
  2. 当然,#define N 7应为#define N 10

  3. 堆栈大小可能不足,但我不这么认为。暂时尝试static int maze_matrix[N][N];将其移出筹码。

  4. 次要:if(y1==y2 && y2==y3 && y3==y4) return y1;不需要,因为此条件会在下一个if (y1<=y2 && y1<=y3 && y1<=y4)中被捕获。

  5. 检查scanf()结果。

    if (scanf ("%d",&arr[i][j]) != 1) Alert_BadInput();
    
  6. 通过所有这些递归,很惊讶你没有使用类似的东西:

    int min4(int y1,int y2,int y3,int y4) {
       return min2((y1 <= y2) ? y1 : y2, (y3 <= y4) ? y3 : y4);
    }
    int min2(int y1,int y2) {
       return (y1 <= y2) ? y1 : y2;
    }
    
  7. 次要:

    // printf("Please enter information for 10 by 10 matrix\n");
    printf("Please enter information for %d by %d matrix\n", N, N);
    
  8. 总而言之,除了UB,堆叠和IO错误之外,我还没有看到 吸烟枪。

  9. 嗯。我认为int min_length=maze (maze_matrix,0,0,0,DOWN);应该从(maze_matrix,0,0,0, TBD);开始,其中TBD可能应为0。

  10. 此外:我 我有。代码使用direction来确保迷宫的行走不会回到“它来自哪里”。但这确实阻止盘旋:UP,RIGHT DOWN,LEFT,UP,RIGHT,......为了解决问题,代码可以为所访问的空间留下标记并使用它来防止循环。