首先是深搜
又叫回溯法。
#include int n, m, p, q, min = 999999; //p, q為 終點座標,m,n為迷宮行數和列數
int a[51][51], book[51][51];
void dfs(int x,int y, int step)
return ; // 返回上一步
} int i, tx, ty, next[4][2] = , , , };
for (i = 0; i <= 3; i++)
} return ;
}
1.涉及到資料結構 ->佇列。將可以走到的點加入佇列,依次將佇列中的點進行探索,將探索過的點出隊。
廣搜可以記錄步數,即每乙個座標可以標記乙個步數和父路徑。下面是 過河卒的一張圖
1 1 1 1 1 1 1
1 2 x 1 x 1 2
1 x 0 1 1 x 2
1 1 1 x 1 1 3
1 x 1 1 0 x 3
1 1 x 1 x 0 3
1 2 2 3 3 3 6
x為障礙,其餘點標記了從0.0到每個點需要用的步數。
下面是**:
#inlcude struct node ;
int main(void), book[51][51] = ;
int next[4][2] = , , , };
int head, tail;
int i, j, k, n, m, startx, starty, p, q, tx, ty, flag;
scanf("%d %d", &n, &m);
for (i = 1; i <= n; i++)
} scanf("%d %d %d %d", &startx, &starty, &p, &q);
head = 1;
tail = 1;
que[tail].x = startx;
que[tail].y = starty;
que[tail].f = 0;
que[tail].s = 0;
tail++;
book[startx][starty] = 1;
flag = 0;
while (head < tail)
if (a[tx][ty] == 0 && book[tx][ty] == 0)
if (tx == p && ty == q)
} if (flag == 1)
head++;
} printf("%d",que[tail-1].s);
return 0;
}
詳情請移步啊哈演算法
這是我的學習總結謝謝
迷宮問題求解(1) 簡單迷宮
標頭檔案 include include include include include maze.h define max 100 typedef struct position datatype typedef struct stack stack void stackinit stack s ...
簡單的迷宮問題
給你乙個n m的迷宮,這個迷宮中有以下幾個標識 s代表起點 t代表終點 x代表障礙物 代表空地 現在你們涵哥想知道能不能從起點走到終點不碰到障礙物 只能上下左右進行移動,並且不能移動到已經移動過的點 輸入第一行乙個整數t 1 t 10 接下來有t組測試資料,對於每一組測試資料,第一行輸入2個數n和m...
1089 簡單迷宮問題
pipi定義了乙個二維陣列 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,請找出從左上角到右下角的最短路線。僅一組測試用例。乙個5 5的二維陣列,表示乙個迷宮。資料保證有唯一解。左上角到右下角的最短路徑,格式如樣例所示。0 1 0 0 ...