2014-11-02 1 views
-1

Я работаю над программой, которая найдет кратчайший путь от робота до выхода. Робот будет перемещаться по вертикали и по горизонтали на 2-мерном массиве. Будет 10 блоков, препятствующих движению робота. Выход всегда будет находиться в 0x7, а положение роботов и блоков будет создано случайным образом.Ошибка сегментации (сбрасывается сердечник). 2D-массив с изменяющимися записями

Подход, который я беру для поиска кратчайшего пути, - это найти положение робота, а затем поместить 1 в каждое возможное положение вправо, влево, вверх и вниз. Затем найдите 1 и положите 2 справа, слева, вверх и вниз. Затем, найдя 2 и снова, положив 3 справа, вправо, вверх и вниз. Я сделаю это, пока не заполнит матрицу.

Тогда самый короткий путь будет от робота до выхода, следующего за номерами в порядке возрастания. Итак, я думаю, что у меня есть большая часть программы.

Моя проблема связана с функцией, которая заполняет матрицу 1,2,3,4.etc. Я получаю ошибку сегментации, и я предполагаю, что после некоторого исследования, что ошибка связана с тем, что я использую память, к которой у меня нет доступа. Если это так, я считаю, что проблема заключается в моей функции заполнения матрицы. Не могли бы вы помочь мне узнать, что не так с моей функцией? Я включаю то, что я написал до сих пор для своей программы.

#include <stdio.h> 
#include <time.h> 
#include <stdlib.h> 

int main() { 
    int A[8][8],num=0; 
    char B[8][8]; 
    char C[64]; 
    char D[64]; 

    intmatrix(A); 
    charmatrix(B); 
    matrixini(B,A); 

    while(num<64) { 
    matrix_find_fill(A,num); 
    num++; 
    } 

    printmatrix(B,A); 

    return 0; 
} 


int printmatrix(char B[8][8], int A[8][8]) { 
    int i, j; 
    for(i=0;i<8;i++) { 
    for(j=0;j<8;j++) { 
     printf("%c ",B[i][j]); 
    } 
    printf("\n"); 
    } 
    for(i=0;i<8;i++) { 
    for(j=0;j<8;j++) { 
     printf("%i ",A[i][j]); 
    } 
    printf("\n"); 
    } 
    return 0; 
} 

int charmatrix(char B[8][8]) { 
    int i,j; 
    for(i=0;i<8;i++) { 
    for(j=0;j<8;j++) { 
     B[i][j]=' '; 
    } 
    } 
    return 0; 
} 

int intmatrix(int A[8][8]) { 
    int i,j; 
    for(i=0;i<8;i++) { 
    for(j=0;j<8;j++) { 
     A[i][j]=-1; 
    } 
    } 
    return 0; 
} 

int matrixini(char B[8][8], int A[8][8]) { 
    int r,c,a,b,n=0; 
    srand((unsigned int)time(NULL)); 
    a=rand()%9; 
    b=rand()%9; 
    B[a][b]='R'; 
    A[a][b]=0; 
    B[0][7]='E'; 
    A[0][7]=99; 
    do{ 
    r=rand()%8; 
    c=rand()%8; 
    if (B[r][c]==' ') { 
     B[r][c]='#'; 
     A[r][c]=-2; 
     n++; 
    } 
    } while(n<10); 
    if ((B[0][6]=='#') && (B[1][7]=='#')) { 
    printf("The Robot wont be able to exit.Game over!\n"); 
    exit(0); 
    } 
    return 0; 
} 

int matrix_find_fill(int A[8][8],int num) { 
    int i,j; 
    for(i=0;i<8;i++) { 
    for(j=0;j<8;j++) { 
     if(A[i][j]==num) { 
     if(i==0) { 
      if((j>=0) && (j<=7)) { 
      if(j==0) { 
       if(A[i+1][j]==-1) { 
       A[i+1][j]=num+1; 
       } 
       if(A[i][j+1]==-1) { 
       A[i][j+1]=num+1; 
       } 
      } 
      if((j>0) && (j<7)) { 
       if(A[i][j-1]==-1) { 
       A[i][j-1]=num+1; 
       } 
       if(A[i][j+1]==-1) { 
       A[i][j+1]=num+1; 
       } 
       if(A[i-1][j]==-1) { 
       A[i-1][j]=num+1; 
       } 
      } 
      if(j==7) { 
       if(A[i+1][j]==-1) { 
       A[i+1][j]=num+1; 
       } 
       if(A[i][j-1]==-1) { 
       A[i][j-1]=num+1; 
       } 
      } 
      } 
      if((j<7) && (A[i][j+1]==-1)) { 
      A[i][j+1]=num+1; 
      } 
     } 
     if((i>0) && (i<7)) { 
      if((j>=0) && (j<=7)) { 
      if(j==0) { 
       if(A[i+1][j]==-1) { 
       A[i+1][j]=num+1; 
       } 
       if(A[i][j+1]==-1) { 
       A[i][j+1]=num+1; 
       } 
       if(A[i-1][j]==-1) { 
       A[i-1][j]=num+1; 
       } 
      } 
      if((j>0) && (j<7)) { 
       if(A[i][j-1]==-1) { 
       A[i][j-1]=num+1; 
       } 
       if(A[i][j+1]==-1) { 
       A[i][j+1]=num+1; 
       } 
       if(A[i-1][j]==-1) { 
       A[i-1][j]=num+1; 
       } 
       if(A[i+1][j]==-1) { 
       A[i+1][j]=num+1; 
       } 
      } 
      if(j==7) { 
       if(A[i+1][j]==-1) { 
       A[i+1][j]=num+1; 
       } 
       if(A[i][j-1]==-1) { 
       A[i][j-1]=num+1; 
       } 
       if(A[i-1][j]==-1) { 
       A[i-1][j]=num+1; 
       } 
      } 
      } 
      if((j<7) && (A[i][j+1]==-1)) { 
      A[i][j+1]=num+1; 
      } 
     } 
     if(i==7) { 
      if((j>=0) && (j<=7)) { 
      if(j==0) { 
       if(A[i-1][j]==-1) { 
       A[i-1][j]=num+1; 
       } 
       if(A[i][j+1]==-1) { 
       A[i][j+1]=num+1; 
       } 
      } 
      if((j>0) && (j<7)) { 
       if(A[i][j-1]==-1) { 
       A[i][j-1]=num+1; 
       } 
       if(A[i][j+1]==-1) { 
       A[i][j+1]=num+1; 
       } 
       if(A[i-1][j]==-1) { 
       A[i-1][j]=num+1; 
       } 
      } 
      if(j==7) { 
       if(A[i-1][j]==-1) { 
       A[i-1][j]=num+1; 
       } 
       if(A[i][j-1]==-1) { 
       A[i][j-1]=num+1; 
       } 
      } 
      } 
      if((j<7) && (A[i][j+1]==-1)) { 
      A[i][j+1]=num+1; 
      } 
     } 
     } 
    } 
    } 
    return 0; 
} 
+0

При заполнении значений матрицы, как часть нахождения кратчайшего пути к выходу, необходимо проверить для каждого направления из текущего направления, чтобы избежать записи вне матрицы. И.Е. функция matrix_find_fill() нуждается в повторной разработке. – user3629249

ответ

1

a = rand() % 9 в matrixini() может выйти до 8, которая выходит за пределы границ. То же самое с b = rand() % 9.

Возможно, вы захотите изменить их на a = rand() % 8 и b = rand() % 8.

Учитывая длину и хитрость вашего кода, вы, вероятно, должны перестроить функцию matrix_find_fill() в более простой формат.

Вот идея другого способа сделать это:

int di[] = {0, 0, 1, -1}; 
int dj[] = {-1, 1, 0, 0}; 

int matrix_find_fill(int A[8][8], int num) { 
    int i, j, k, ni, nj; 
    for(i = 0; i < 8; i++) for(j = 0; j < 8; j++) { 
    if(A[i][j] == num) { 
     for(k = 0; k < 4; k++) { 
     ni = i + di[k]; 
     nj = j + dj[k]; 
     if(ni >= 0 && nj >= 0 && ni < 8 && nj < 8 && A[ni][nj] == -1) { 
      A[ni][nj] = num + 1; 
     } 
     } 
    } 
    } 
} 

Объяснение:

Для каждой позиции (i, j), которая удовлетворяет A[i][j] = num, мы используем di и dj вычислить возможные соседние клетки от (i, j). По существу, ni и nj охватывают все эти случаи: (i + 1, j), (i - 1, j), (i, j + 1), (i, j - 1).

Затем оператор if проверяет, являются ли значения ni и nj. Мы обновляем A[ni][nj] до num + 1, если в настоящее время -1.

Однако, следует отметить, что существуют эффективные алгоритмы кратчайших путей, которые вы должны Кредитное плечо, некоторые из которых являются:

Кроме того, я надеюсь, что вы Ждут» t начать тестирование кода после написания всей программы - это почти всегда вызывает болезненные ошибки.

+0

Я просто сделал. Я все равно получаю ту же ошибку. :( – dperez

+0

Я тестировал код и писал, но часть заполнения номеров меня так путала, что я несколько раз менял программу. Спасибо за помощь. – dperez

+0

Не делает ли это заявление if? Если я заявляю, что это можно сделать только в определенных обстоятельствах. Правильно? Спасибо – dperez

Смежные вопросы