2016-09-02 2 views
0

プログラムはインデックス[0] [1]で開始し、インデックス[7] [7]に到達すると迷路を完了します。プログラムが "FindPath"関数に到達すると、プログラムがクラッシュします。私が間違っていることを考えることはできません。どんな情報も役立ちます。私はXの空白と空白を再帰的に解決するプログラムをC言語で書く必要があります。

#include "Header.h" 

int main(void) { 

int x = 0, y = 1; 

char maze[8][8] = { 
{' ', ' ', 'x', 'x', 'x', 'x', 'x', 'x'}, 
{' ', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, 
{' ', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, 
{' ', ' ', ' ', ' ', ' ', 'x', 'x', 'x'}, 
{'x', 'x', 'x', 'x', ' ', 'x', 'x', 'x'}, 
{'x', 'x', 'x', 'x', ' ', ' ', ' ', ' '}, 
{'x', 'x', 'x', 'x', 'x', 'x', 'x', ' '}, 
{'x', 'x', 'x', 'x', 'x', 'x', 'x', ' '}, 
}; 

for (int i = 0; i < 8; i++) { 
    for (int j = 0; j < 8; j++) { 
     printf("%c ",maze[i][j]); 
    } 
     printf("\n"); 
} 


FindPath(maze, x, y); 

return 0; 
} 


#include "Header.h" 

void FindPath(char maze[8][8], int x, int y) { 

if (x == 7 & y == 7) { 
    printf("Maze complete"); 

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

    if (maze[x + 1][y] = ' ') { 
     maze[x][y] = 'h'; 
     FindPath(maze, x + 1, y); 
     return; 
    } 
    else if (maze[x - 1][y] = ' ') { 
     maze[x][y] = 'h'; 
     FindPath(maze, x - 1, y); 
     return; 
    } 
    else if (maze[x][y + 1] = ' ') { 
     maze[x][y] = 'h'; 
     FindPath(maze, x, y + 1); 
     return; 
    } 
    else if (maze[x][y - 1] = ' ') { 
     maze[x][y] = 'h'; 
     FindPath(maze, x, y - 1); 
     return; 
    } 
    else { 
     printf("no path found"); 
     return; 
    } 
} 
} 
+4

'場合(迷路[X + 1] [Y] = '「)' - あなたが意味するものではありませんでしたかなり確信**割り当て**を実行します。 '=='演算子は等価比較のためのものです。あなたのコードの他の場所でも繰り返されます。だから、 "私が間違ってやっていること"のトップレベルは、賢明な警告を有効にしてコンパイルするのではなく、検査の際にそれらを修正することになります。 – WhozCraig

+0

私の推測では、スタックオーバーフローが発生しています。デバッガでプログラムをステップ実行し、どこに行くのかを確認します。 – Barmar

+0

@WhozCraigが正しいです。 1つの一般的なプラクティスは、==の代わりに=を使用すると、コンパイラが問題をキャッチするように、==の左側に定数を指定して条件を記述することです。つまり、if( '' = maze [x + 1] [y]) ' – bruceg

答えて

2

私は問題があなたが作っているよりも簡単だと信じています。

あなたのアプローチに関する主な問題:FindPath()は、試行錯誤のベースで動作する必要があります。成功したり失敗したり、発信者にその旨を伝えたり、誤った前提を取り消したりするための戦略はありません。あなたのコードで

問題:人々はすでに===を記載しているが、あなたは&&を意味するときにも&を使用します。あなたのコードインデント、またはSOコードの掲示には、仕事が必要です。コード内の数字を避けるように努めて、後で迷路を取り替えることができます。下位レベルのルーチンは結果を返すべきであり、印刷ではありません。より高いレベルのルーチンは、結果を取り戻し、何を印刷するかを決める必要があります。重複したコードがたくさんある - 重複したステートメントをレベルアップさせる。 xがゼロの場合に割り当てられなかったメモリには、maze[x - 1][y]のような式が侵入する可能性があるため、リミットチェックが必要です。

以下は、上記の行に沿ってコードを修正し、スタイルを変更したものです。これは、1つはあなたが提供迷路解く:

#include <stdio.h> 
#include <stdbool.h> 

#define WIDTH (8) 
#define HEIGHT (8) 

void printMaze(char maze[WIDTH][HEIGHT]) { 

    for (int i = 0; i < WIDTH; i++) { 
      for (int j = 0; j < HEIGHT; j++) { 
        printf("%c ", maze[i][j]); 
     } 
     putchar('\n'); 
    } 
} 

bool findPath(char maze[WIDTH][HEIGHT], int x, int y) { 

    maze[x][y] = 'h'; 

    if (x == WIDTH - 1 && y == HEIGHT - 1) { 
     return true; 
    } 

    if (x + 1 < WIDTH && maze[x + 1][y] == ' ') { 
     if (findPath(maze, x + 1, y)) { 
      return true; 
     } 
    } 

    if (x - 1 >= 0 && maze[x - 1][y] == ' ') { 
     if (findPath(maze, x - 1, y)) { 
      return true; 
     } 
    } 

    if (y + 1 < HEIGHT && maze[x][y + 1] == ' ') { 
     if (findPath(maze, x, y + 1)) { 
      return true; 
     } 
    } 

    if (y - 1 >= 0 && maze[x][y - 1] == ' ') { 
     if (findPath(maze, x, y - 1)) { 
      return true; 
     } 
    } 

    maze[x][y] = ' '; 

    return false; 
} 

int main(void) { 

    char maze[WIDTH][HEIGHT] = { 
     {' ', ' ', 'x', 'x', 'x', 'x', 'x', 'x'}, 
     {' ', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, 
     {' ', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, 
     {' ', ' ', ' ', ' ', ' ', 'x', 'x', 'x'}, 
     {'x', 'x', 'x', 'x', ' ', 'x', 'x', 'x'}, 
     {'x', 'x', 'x', 'x', ' ', ' ', ' ', ' '}, 
     {'x', 'x', 'x', 'x', 'x', 'x', 'x', ' '}, 
     {'x', 'x', 'x', 'x', 'x', 'x', 'x', ' '}, 
    }; 

    printMaze(maze); 

    if (findPath(maze, 0, 1)) { 
     printf("Maze completed!\n"); 
     printMaze(maze); 
    } else { 
     printf("No path found!"); 
    } 

    return 0; 
} 

OUTPUT

> ./a.out 
    x x x x x x 
    x x x x x x x 
    x x x x x x x 
      x x x 
x x x x x x x 
x x x x   
x x x x x x x 
x x x x x x x 
Maze completed! 
h h x x x x x x 
h x x x x x x x 
h x x x x x x x 
h h h h h x x x 
x x x x h x x x 
x x x x h h h h 
x x x x x x x h 
x x x x x x x h 
> 
関連する問題