用動態規劃優化老鼠走迷宮中的最短路線解法

2021-06-03 10:58:48 字數 3789 閱讀 2852

#include #include #include #include #include #ifdef _win32

#include #endif

#ifndef strict

#define strict 1

#endif

/* 巨集dynamic-是否開啟動態規劃 */

#define dynamic 1

#define disopti1 1

/* 巨集disprocedure-是否動態演示搜尋過程 */

#define disprocedure 1

/* 巨集fullnull-是否全空 */

#define fullnull1 1

/* 巨集_random_-是否使用隨機資料 */

#define _random_ 1

/* 巨集waitpresskey-等待按鍵 */

#define waitpresskey1 1

#define mousemaze1 1

#define mousemaze2 1

#ifdef mousemaze1

#define xsize1 75

#define ysize1 22

#define xsize xsize1

#define ysize ysize1

#ifdef _win32

void gotoxy(int x, int y);

#else

void cursor(unsigned int mode);

#endif

void visit(int x, int y);

void disresult(void);

char maze[ysize1][xsize1] =

, ,

, ,

, ,

, ,

, ,

, ,

, ,

, ,

, ,

, ,

, };

#else

#ifdef mousemaze2

#define xsize 20

#define ysize 15

char maze[ysize][xsize] =

, ,

, ,

, ,

, ,

, ,

, ,

, ,

};#else

#define xsize 9

#define ysize 9

char maze[ysize][xsize] =

, ,

, ,

, ,

, ,

};#endif

#endif

const int top = 2;

const int left = 3;

int startx = 1, starty = 1; /* 入口 */

int endx = xsize - 2, endy = ysize - 2; /* 出口 */

int success = 0;

#ifdef dynamic

int routearray[ysize][xsize];

#endif

int minlength = rand_max;

int routelength = 0;

int minroutes[xsize * ysize][2];

int routes[xsize * ysize][2];

#ifdef _win32

#define wallcode 'x'

handle hout;

void gotoxy(int x, int y)

#else

#define wallcode 219

void cursor(unsigned int mode)

else

r.x.cx = 0x2020;

int86(0x10, &r, &r);

}#endif

int main(void)

maze[i][xsize - 1] = 2;

gotoxy(xsize - 1 + left, i + top);

printf("%c", wallcode);

} maze[starty][startx] = 0;

maze[endy][endx] = 0;

gotoxy(startx + left, starty + top);

printf("s");

gotoxy(endx + left, endy + top);

printf("e");

/* 多次搜尋標記死角,直到找不到為止 */

k = 1;

while(k)

else if (maze[i][j + 1] != 0 && maze[i + 1][j] != 0 && maze[i][j - 1] != 0)

else if (maze[i + 1][j] != 0 && maze[i][j - 1] != 0 && maze[i - 1][j] != 0)

else if (maze[i][j - 1] != 0 && maze[i - 1][j] != 0 && maze[i][j + 1] != 0)}}

}} getch();

visit(startx, starty);

if (success)

disresult();

getch();

#ifdef _win32

closehandle(hout);

#endif

}void visit(int x, int y)

else

#endif

if (y == endy && x == endx)

if (routelength < minlength)

}#ifdef disprocedure

gotoxy(x + left, y + top);

printf(" ");

#endif

#ifdef waitpresskey

getch();

#endif

maze[y][x] = 0;

routelength--;

return;

} if (maze[y + 1][x] == 0)

visit(x, y + 1);

if (maze[y][x + 1] == 0)

visit(x + 1, y);

if (maze[y - 1][x] == 0)

visit(x, y - 1);

if (maze[y][x - 1] == 0)

visit(x - 1, y);

#ifdef disprocedure

gotoxy(x + left, y + top);

printf(" ");

#endif

maze[y][x] = 0;

routelength--;

}void disresult(void)

} #ifndef _win32

textcolor(7);

#endif

for (i = 0; i < minlength; i++)

gotoxy(1, 1);

printf("%d", minlength);

}

尋找迷宮中的最短路徑

給定乙個n m的二維整數陣列,用來表示乙個迷宮,陣列中只包含0或1,其中0表示可以走的路,1表示不可通過的牆壁。最初,有乙個人位於左上角 1,1 處,已知該人每次可以向上 下 左 右任意乙個方向移動乙個位置。請問,該人從左上角移動至右下角 n,m 處,至少需要移動多少次。資料保證 1,1 處和 n,...

走迷宮記錄所走最短路徑的步數(最容易理解的)

include define n 10005 struct ak a n int n,m 地圖大小n m int x,y,p,q 起始位置 x,y 和終止位置 p,q int tx,ty 當前所在位置 tx,ty int map n n 地圖的形狀 int flag n n 標記地圖 int nex...

用動態規劃演算法求解最短路線問題

問題如下 設有乙個旅行者從a點出發,途中要經過b,c,d等處,最後到達e,從a到e有很多條路線可走,各個點的距離如下,問旅行者應該選擇哪一條,是使a到e路線最短。求解演算法 public class dp public void setmatrix int matrix 任意兩點之間的距離,前提是p...