Я работаю над программой, которая найдет кратчайший путь от робота до выхода. Робот будет перемещаться по вертикали и по горизонтали на 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;
}
При заполнении значений матрицы, как часть нахождения кратчайшего пути к выходу, необходимо проверить для каждого направления из текущего направления, чтобы избежать записи вне матрицы. И.Е. функция matrix_find_fill() нуждается в повторной разработке. – user3629249