日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

java栈 迷宫_利用栈实现迷宫的求解

發(fā)布時(shí)間:2023/11/27 生活经验 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java栈 迷宫_利用栈实现迷宫的求解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

問(wèn)題描述:這時(shí)實(shí)驗(yàn)心理學(xué)中的一個(gè)典型的問(wèn)題,心理學(xué)家吧一只老鼠從一個(gè)無(wú)頂?shù)拇蠛凶拥娜肟谔広s進(jìn)迷宮。迷宮設(shè)置很多隔壁,對(duì)前進(jìn)方向形成了許多障礙,心理學(xué)家在迷宮的唯一出口處放置了一塊奶酪,吸引老鼠仔迷宮中尋找通路以到達(dá)出口。

求解思想:回溯法是一種不斷試探且及時(shí)糾正錯(cuò)誤的搜索方法,下面的求解過(guò)程采用回溯法。從入口出發(fā),按某一方向向前探索,若能走通(未走過(guò)的),即某處可以到達(dá),則到達(dá)一個(gè)新點(diǎn),否則試探下一個(gè)方向;若所有的方向均沒(méi)有通路,則沿原路返回前一點(diǎn),換下一個(gè)方向繼續(xù)試探,直到所有可能的通路都搜索到,或找到一條通路,或無(wú)路可走又返回到入口點(diǎn)。這里可以用一個(gè)棧來(lái)實(shí)現(xiàn),每走一步,將該位置壓入棧中,若該點(diǎn)無(wú)路可走,則出棧返回上一位置。

需要解決的四個(gè)問(wèn)題:

(1)表示迷宮的數(shù)據(jù)結(jié)構(gòu)

設(shè)迷宮為m行n列,利用數(shù)組maze[m][n]來(lái)表示一個(gè)迷宮,maze[i][j]=0或1,其中0表示通路,1表示不通。迷宮該數(shù)組四邊都為1,代表迷宮四周都是墻。這樣就可以保證每個(gè)點(diǎn)都有8個(gè)方向可以試探。

入口為(1,1),出口為(6,8)

1,1,1,1,1,1,1,1,1,1

1,0,1,1,1,0,1,1,1,1

1,1,0,1,0,1,1,1,1,1

1,0,1,0,0,0,0,0,1,1

1,0,1,1,1,0,1,1,1,1

1,1,0,0,1,1,0,0,0,1

1,0,1,1,0,0,1,1,0,1

1,1,1,1,1,1,1,1,1,1

(2)試探方向

迷宮中間每個(gè)點(diǎn)都有8個(gè)方向可以試探。其增量數(shù)組可以用一個(gè)1*2的二維數(shù)組move表述,具體值如下:

x  y

0  0  1

1??? 1?????1

2??? 1?????0

3??? 1???? -1

4??? 0?????-1

5??? -1??? -1

6??? -1?? ?0

7??? -1??? 1

在move數(shù)組中,x表示橫坐標(biāo)的增量,y表示縱坐標(biāo)的增量。

(3)棧中存放元素的設(shè)計(jì)

棧中所存放的元素應(yīng)該包含所到達(dá)的每點(diǎn)的坐標(biāo)以及從該點(diǎn)沿哪個(gè)方向向下走的。可以用一個(gè)類表示:

1 classStep{2 intx,y,d;3 public Step(int x,int y,intd) {4 this.x = x;//橫坐標(biāo)

5 this.y = y;//縱坐標(biāo)

6 this.d = d;//方向

7 }8 }

(4)防止重復(fù)到達(dá)某點(diǎn)而發(fā)生死循環(huán)

可以用兩種方法來(lái)實(shí)現(xiàn),第一種就是另外設(shè)置一個(gè)標(biāo)志數(shù)組mark[m][n],它的所有元素初始都為0,一旦到達(dá)某點(diǎn),則設(shè)置該點(diǎn)的標(biāo)志位1,下次試探的時(shí)候就不再走這點(diǎn)了。第二種就是當(dāng)?shù)竭_(dá)某點(diǎn)的時(shí)候,使maze[i][j]置為-1,以便區(qū)別為達(dá)到的點(diǎn),同樣也可以防止走重復(fù)點(diǎn)的作用。

具體代碼如下:

1 packagecom.stack;2

3 importjava.util.Stack;4

5 /**

6 * 用棧來(lái)實(shí)現(xiàn)迷宮的求解7 *@author劉玲8 *9 */

10

11 classStep{12 intx,y,d;13 public Step(int x,int y,intd) {14 this.x = x;//橫坐標(biāo)

15 this.y = y;//縱坐標(biāo)

16 this.d = d;//方向

17 }18 }19

20 public classMazeTest {21

22 public static voidmain(String[] args) {23 //迷宮定義

24 int[][] maze = {{1,1,1,1,1,1,1,1,1,1},25 {1,0,1,1,1,0,1,1,1,1},26 {1,1,0,1,0,1,1,1,1,1},27 {1,0,1,0,0,0,0,0,1,1},28 {1,0,1,1,1,0,1,1,1,1},29 {1,1,0,0,1,1,0,0,0,1},30 {1,0,1,1,0,0,1,1,0,1},31 {1,1,1,1,1,1,1,1,1,1}};32 int[][] move = {{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};33 Stack s = new Stack();34 Stack s1 = new Stack();35 int a =path(maze, move, s);36 while(!s.isEmpty()){37 Step step =s.pop();38 System.out.println(step.x+":"+step.y);39 }40 }41 public static int path(int[][] maze,int[][] move,Stacks){42 Step temp = new Step(1,1,-1); //起點(diǎn)

43 s.push(temp);44 while(!s.isEmpty()){45 temp =s.pop();46 int x =temp.x;47 int y =temp.y;48 int d = temp.d+1;49 while(d<8){50 int i = x + move[d][0];51 int j = y + move[d][1];52 if(maze[i][j] == 0){ //該點(diǎn)可達(dá)

53 temp = new Step(i,j,d); //到達(dá)新點(diǎn)

54 s.push(temp);55 x =i;56 y =j;57 maze[x][y] = -1; //到達(dá)新點(diǎn),標(biāo)志已經(jīng)到達(dá)

58 if(x == 6 && y == 8){59 return 1; //到達(dá)出口,迷宮有路,返回1

60 }else{61 d = 0; //重新初始化方向

62 }63 }else{64 d++; //改變方向

65 }66 }67 }68 return 0;69 }70

71 }

輸出結(jié)果如下:

6:8

5:8

5:7

5:6

4:5

3:5

3:4

3:3

2:2

由于棧是后進(jìn)先出的,所以結(jié)果應(yīng)該從下面看起(2,2)->(3,3)->(3,4)->(3,5)->(4,5)->(5,6)->(5,7)->(5,8)->(6,8)

有運(yùn)行結(jié)果可以看出來(lái),棧中所存儲(chǔ)的就是迷宮的一條通路。

上面那個(gè)代碼有一點(diǎn)點(diǎn)小問(wèn)題,非常感謝問(wèn)題的提出者,修改如下:

1 packagecom.stack;2

3 importjava.util.Stack;4

5 /**

6 * 用棧來(lái)實(shí)現(xiàn)迷宮的求解7 *@author劉玲8 *9 */

10

11 classStep{12 intx,y,d;13 public Step(int x,int y,intd) {14 this.x = x;//橫坐標(biāo)

15 this.y = y;//縱坐標(biāo)

16 this.d = d;//方向

17 }18 }19

20 public classMazeTest {21

22 public static voidmain(String[] args) {23 //迷宮定義

24 int[][] maze = {{1,1,1,1,1,1,1,1,1,1},25 {1,0,1,1,1,0,1,1,1,1},26 {1,1,0,1,0,1,1,1,1,1},27 {1,0,1,0,0,0,0,0,1,1},28 {1,0,1,1,1,0,1,1,1,1},29 {1,1,0,0,1,1,0,0,0,1},30 {1,0,1,1,0,0,1,1,0,1},31 {1,1,1,1,1,1,1,1,1,1}};32 int[][] move = {{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};33 Stack s = new Stack();34 int a =path(maze, move, s);35 while(!s.isEmpty()){36 Step step =s.pop();37 System.out.println(step.x+":"+step.y);38 }39 }40 public static int path(int[][] maze,int[][] move,Stacks){41 Step temp = new Step(1,1,-1); //起點(diǎn)

42 s.push(temp);43 while(!s.isEmpty()){44 //temp = s.pop(); 這樣寫是有問(wèn)題的,不能將出棧的元素作為當(dāng)前位置,應(yīng)該將棧頂元素作為當(dāng)前位置

45 s.pop(); //如果路走不通就出棧

46 if(!s.isEmpty()){47 temp = s.peek(); //將棧頂元素設(shè)置為當(dāng)前位置

48 }49 int x =temp.x;50 int y =temp.y;51 int d = temp.d+1;52 while(d<8){53 int i = x + move[d][0];54 int j = y + move[d][1];55 if(maze[i][j] == 0){ //該點(diǎn)可達(dá)

56 temp = new Step(i,j,d); //到達(dá)新點(diǎn)

57 s.push(temp);58 x =i;59 y =j;60 maze[x][y] = -1; //到達(dá)新點(diǎn),標(biāo)志已經(jīng)到達(dá)

61 if(x == 6 && y == 1){62 return 1; //到達(dá)出口,迷宮有路,返回1

63 }else{64 d = 0; //重新初始化方向

65 }66 }else{67 d++; //改變方向

68 }69 }70 }71 return 0;72 }73

74 }

總結(jié)

以上是生活随笔為你收集整理的java栈 迷宫_利用栈实现迷宫的求解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。