2016-12-13 14 views
1

Я пытаюсь вернуться назад лабиринт в С.Maze Backtrack в Ce

Мне нужно, чтобы найти кратчайший путь от 0 | 0 к n | n.

Я не могу получить правильный выход. Я не вижу своей ошибки.

Я думаю, что это из-за типов char: int, но я не уверен.

Вход: Labyrinth.def

7 6 
0 1 0 0 0 1 1 
0 0 0 1 0 1 1 
0 1 0 1 0 1 1 
0 0 0 0 0 0 1 
1 1 1 0 1 0 0 
1 1 1 0 1 1 0 

C Код

#include <stdio.h> 

#define MAXROWS 100 
#define MAXCOLS 100 
#define WEG '0' 
#define MAUER '1' 
#define MARKIERT 'x' 
#define NOTFOUND 0 
#define FOUND !NOTFOUND 

typedef char Labyrinth[MAXROWS][MAXCOLS]; 

void search(Labyrinth l, int *done, int x, int y, int zx, int zy) { 
    //printf("position => %d | %d\n", x, y); 
    if (x == zx && y == zy) { 
     *done == FOUND; 
    } 
    else { //Weg suchen 
     if (!*done && y + 1 <= zy && l[y + 1][x] == WEG) { // runter 
      search(l, done, x, y + 1, zx, zy); 
      //printf("runter\n"); 
     } 
     if (!*done && x + 1 <= zx && l[y][x + 1] == WEG) { // rechts 
      search(l, done, x + 1, y, zx, zy); 
      //printf("rechts\n"); 
     } 
     if (!*done && y - 1 <= zy && l[y - 1][x] == WEG) {// hoch 
      search(l, done, x, y - 1, zx, zy); 
      //printf("hoch\n"); 
     } 
     if (!*done && x - 1 <= zx && l[y][x - 1] == WEG) {// links 
      search(l, done, x - 1, y, zx, zy); 
      //printf("links\n"); 
     } 
     if (!*done) { 
      l[y][x] = WEG; 
      //printf("log\n"); 
     } 
    } 
} 

void loadLabyrinth(Labyrinth l, int *currRows, int *currCols) { 
    FILE *fp = NULL; 
    int i = 0; 
    int tmp = 0; 

    int x = 0; 
    int y = 0; 

    bool s = false; 

    //werte aus datei lesen 
    fp = fopen("labyrinth.def", "r"); //datei öffnen 

    if (fp != NULL) { 
     //printf("Datei geoeffnet\n"); 
     while (!feof(fp)) { 
      fscanf(fp, "%d", &tmp); //datei int für int einlesen 

      if (s == false) { 
       if (i == 0) { 
        *currRows = tmp; 
       } 
       else if (i == 1) { 
        *currCols = tmp; 
        s = true; 
        i = 0; 
       } 
      } 
      else if (s == true) { 
       l[x][y] = (char)tmp; 
       x++; 
       if (i % *currRows == 0) { 
        x = 0; 
        y += 1; 
       } 
      } 

      i++; 

      //printf("%d", tmp); 
     } 
    } 
    else { 
     printf("Datei nicht gefunden ... :(\n"); 
    } 

    fclose(fp); // datei schließen 
} 

void displayLabyrinth(Labyrinth l, int rows, int cols) { 
    for (int i = 0; i < cols; i++) { 
     for (int k = 0; k < rows; k++) { 
      printf("%i ", l[k][i]); 
      if (k + 1 == rows) printf("\n"); 
     } 
    } 
} 

int main() 
{ 
    Labyrinth laby; 

    int currRows = 0; 
    int currCols = 0; 
    int geschafft = NOTFOUND; 

    int array[MAXROWS][MAXCOLS]; 

    loadLabyrinth(laby, &currRows, &currCols); // Labyrinth laden 

    printf("%d %d\n", currRows, currCols); 

    displayLabyrinth(laby, currRows, currCols); // Labyrinth ausgeben 

    printf("\nLabyrinth geladen ! \n"); 
    printf("Loesung wird gesucht ... \n\n"); 

    //do { 
     search(laby, &geschafft, 0, 0, currCols - 1, currRows - 1); 
    //}while (geschafft != FOUND); 

    displayLabyrinth(laby, currRows, currCols); // Labyrinth ausgeben 

    getchar(); 
} 

Выход Consol:

48 1 0 0 0 1 1 
0 0 0 1 0 1 1 
0 1 0 1 0 1 1 
0 0 0 0 0 0 1 
1 1 1 0 1 0 0 
1 1 1 0 1 1 0 
+1

'в то время как (! Feof (FP)) { fscanf (∥f∥p, "% d", &tmp);' последний TMP является недействительным. Вы должны проверить возвращаемое значение 'fscanf' вместо –

+1

' 1' - это не то же самое, что '' 1''. – molbdnilo

+0

rows <=> coumns – BLUEPIXY

ответ

0

Элементы в лабиринте являются char, не int, так что вам нужно заменить

printf("%i ", l[k][i]); 

с

printf("%c ", l[k][i]);