Linux Cワンストップ学習問題解答12.3.3迷宮問題深さ優先
2480 ワード
スタックで興味深い問題を解決し、2 D配列を定義します.
3、前節ではスタックベースのプログラムを実装し、それを再帰プログラムに書き換え、自分が実装したスタックの代わりに関数呼び出しのスタックフレームを用いた.本節のDFSアルゴリズムもスタックベースですので、それを再帰プログラムに書き換えてください.書き換えは使用を避けることができます.
注:転載はソースアドレスを明記してください.http://blog.csdn.net/whorus1/article/list/2あ、ありがとう!
int maze[5][5] = {
0, 1, 0, 0, 0,
0, 1, 0, 1, 0,
0, 0, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 1, 0,
};
それは1つの迷路を表して、その中の1は壁を表して、0は歩くことができる道を表して、横に歩くか縦に歩くしかなくて、斜めに歩くことができなくて、プログラムに左上の角から右下の角までのルートを探し出すように要求します.3、前節ではスタックベースのプログラムを実装し、それを再帰プログラムに書き換え、自分が実装したスタックの代わりに関数呼び出しのスタックフレームを用いた.本節のDFSアルゴリズムもスタックベースですので、それを再帰プログラムに書き換えてください.書き換えは使用を避けることができます.
predecessor
データ構造、どうすればいいか考えてみましょう.注:転載はソースアドレスを明記してください.http://blog.csdn.net/whorus1/article/list/2あ、ありがとう!
#include <stdio.h>
#define MAX_LEN_STK 512
#define MAX_ROW 5
#define MAX_COL 5
int top = 0;
struct point{int row, col;};
struct point path[MAX_LEN_STK]; /* */
struct point make_from_cor(int prow, int pcol)
{
struct point p;
p.row = prow;
p.col = pcol;
return p;
}
int maze[MAX_ROW][MAX_COL] = {
0, 1, 0, 0, 0,
0, 1, 0, 1, 0,
0, 0, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 1, 0,
};
void print_maze()
{
int i, j;
for (i = 0; i < MAX_ROW; i++)
{
for (j = 0; j < MAX_COL; j++)
{
printf("%d ", maze[i][j]);
}
printf("
");
}
printf("*********
");
}
int path_search(struct point p)
{
maze[p.row][p.col] = 2;
print_maze();
if (p.row == MAX_ROW - 1 && p.col == MAX_COL - 1) /* goal */
{
path[top++] = make_from_cor(p.row, p.col);
return 1;
}
if ((p.col < MAX_COL - 1 && maze[p.row][p.col+1] == 0) /* right */
&& (path_search(make_from_cor(p.row, p.col+1))))
{
path[top++] = make_from_cor(p.row, p.col);
return 1;
}
if ((p.row < MAX_ROW - 1 && maze[p.row+1][p.col] == 0) /* down */
&& (path_search(make_from_cor(p.row+1, p.col))))
{
path[top++] = make_from_cor(p.row, p.col);
return 1;
}
if ((p.col > 0 && maze[p.row][p.col-1] == 0) /* left */
&& (path_search(make_from_cor(p.row, p.col-1))))
{
path[top++] = make_from_cor(p.row, p.col);
return 1;
}
if ((p.row > 0 && maze[p.row-1][p.col] == 0) /* up */
&& (path_search(make_from_cor(p.row-1, p.col))))
{
path[top++] = make_from_cor(p.row, p.col);
return 1;
}
return 0;
}
void print_path()
{
int i;
--top;
for (i = top; i >= 0; i--)
{
printf("(%d, %d)
", path[i].row, path[i].col);
}
}
int main(void)
{
struct point p = {0, 0};
if (path_search(p))
{
print_path();
}
else
printf("No path!
");
return 0;
}