java實(shí)現(xiàn)用鏈?zhǔn)綏G蠼饷詫m問(wèn)題--(2)實(shí)現(xiàn)迷宮的搜索算法

maze.txt(*代表可通,#代表不通)

~~~

/**

* 1 從maze.txt讀入迷宮

* 2 從入口坐標(biāo)(1,1)尋找到出口的通路

* 3 顯示迷宮中數(shù)據(jù)

* 0 退出程序

* MazeApp

* 創(chuàng)建人:guxiaohao

* 時(shí)間:2017年10月29日-上午9:56:52

* @version 1.0.0

*

*/

public class MazeApp {

// 程序菜單

static void menu() {

System.out.println("\t***********迷宮問(wèn)題*****************");

System.out.println("\t*? 1 從maze.txt讀入迷宮? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *");

System.out.println("\t*? 2 從入口坐標(biāo)(1,1)尋找到出口的通路? *");

System.out.println("\t*? 3 顯示迷宮中數(shù)據(jù)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *");

System.out.println("\t*? 0 退出程序? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *");

System.out.println("\t***********************************");

System.out.println("\t請(qǐng)輸入菜單項(xiàng):");

}

//程序入口

public static void main(String[] args) {

Maze maze = null;

int choice;

boolean flag = false;

MazeApp md = new MazeApp();

Scanner sc = null;

sc = new Scanner(System.in);

while (true) {

menu();// 顯示菜單

choice = sc.nextInt();// 輸入菜單選項(xiàng)

switch (choice) {

case 1:

// 讀取迷宮信息

maze = md.loadMaze();

flag = true; // 可以求迷宮路徑了

break;

case 2:

if (maze != null && flag) {

// 求迷宮入口到出口的路徑

if (!md.searchMazePath(maze))

System.out.println("迷宮中從(1,1)到(" + (maze.rowNum - 2)

+ "," + (maze.colNum - 2) + ")不存在通路!");

flag = false; // 不能重復(fù)求迷宮路徑,除非再次加載迷宮數(shù)據(jù)。

} else {

System.out.println("先執(zhí)行菜單1砂心,加載或再次加載迷宮數(shù)據(jù)雌团!");

}

break;

case 3:

if (maze != null) {

// 顯示迷宮的內(nèi)容(包括圍欄)期奔,*代表可通,#代表不通

printMaze(maze);

} else {

System.out.println("尚未加載迷宮數(shù)據(jù)制市!");

}

break;

case 0:

sc.close();

System.exit(0);

break;

default:

System.out.println("菜單選擇錯(cuò)誤志衍,請(qǐng)重新輸入!\n");

}

}

}

// 定義描述迷宮中當(dāng)前位置的類(lèi)

class T {

int x; // x代表當(dāng)前位置的行坐標(biāo)

int y; // y代表當(dāng)前位置的列坐標(biāo)

int dir; // 0——東暖庄;1——南聊替;2——西;3——北雄驹;4——不通

T() {

this.x = 1;

this.y = 1;

this.dir = 0;

}

T(int x, int y, int dir) {

this.x = x;

this.y = y;

this.dir = dir;

}

}

class Maze {

char mat[][] = null; // 定義二維數(shù)組存取迷宮

int rowNum = 0, colNum = 0;

}

// 從文件中加載(讀鹊枧!)迷宮數(shù)據(jù)

private Maze loadMaze() {

Maze maze = new Maze();

BufferedReader br = null;

try {

br = new BufferedReader(new FileReader(new File("maze.txt")));

String rc[] = br.readLine().trim().split(" "); // 先讀入迷宮的行數(shù)和列數(shù)

maze.rowNum = Integer.parseInt(rc[0]);

maze.colNum = Integer.parseInt(rc[1]);

maze.mat = new char[maze.rowNum][]; // 存儲(chǔ)迷宮數(shù)據(jù)的二維數(shù)組

for (int i = 0; i < maze.rowNum; i++) {

// 每次讀入迷宮數(shù)據(jù)的一行淹辞,并轉(zhuǎn)換成char類(lèi)型的數(shù)組

maze.mat[i] = br.readLine().trim().toCharArray();

if (maze.mat[i].length != maze.colNum) {

System.out.println("數(shù)據(jù)文件中的迷宮行列數(shù)有誤医舆,請(qǐng)檢查數(shù)據(jù)文件!");

return null;

}

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

br.close();

} catch (IOException e) {

e.printStackTrace();

}

}

printMaze(maze);// 顯示迷宮

System.out.println("迷宮數(shù)據(jù)加載成功!");

return maze; // 返回迷宮對(duì)象

}

/**

* 搜索從左上角到右下角的迷宮通道

* 定義一個(gè)標(biāo)志數(shù)組mark[][],用來(lái)標(biāo)記走過(guò)的路徑,并全部賦初值為0(表示未走過(guò)),每走過(guò)一個(gè)坐標(biāo),就記當(dāng)前標(biāo)記為1

* app

* 方法名:searchMazePath

* 創(chuàng)建人:guxiaohao

* 時(shí)間:2017年10月29日-上午9:42:32

* @param maze

* @return boolean

* @exception

* @since? 1.0.0

*/

private boolean searchMazePath(Maze maze) {

LinkedStack ls = new LinkedStack();

int mark[][] = new int[maze.rowNum-1][maze.colNum-1];

for ( int i=1;i<maze.rowNum-1;i++)

for ( int j=1;j<maze.colNum-1;j++)

mark[i][j]=0;

T t = new T();

int tX = 1;

int tY = 1;

ls.push(t);

while( !ls.isEmpty() ){

T mt = (T) ls.getTop();//每次循環(huán)把棧頂元素給mt

tX = mt.x;

tY = mt.y;

if ( tX==maze.rowNum-2 && tY==maze.colNum-2 ) {

mt.dir = 0;

break;

}

if ( maze.mat[tX][tY+1] == '*' && mark[tX][tY+1] == 0 ) { //東方

mt.dir = 0;

ls.push(new T(tX,tY+1,0));

mark[tX][tY+1] = 1;

} else if ( maze.mat[tX+1][tY] == '*' && mark[tX+1][tY] == 0 ) { //南方

mt.dir = 1;

ls.push(new T(tX+1,tY,1));

mark[tX+1][tY] = 1;

} else if ( maze.mat[tX][tY-1] == '*' && mark[tX][tY-1] == 0 ) { //西方

mt.dir = 2;

ls.push(new T(tX,tY-1,2));

mark[tX][tY-1] = 1;

} else if ( maze.mat[tX-1][tY] == '*' && mark[tX-1][tY] == 0 ) { //北方

mt.dir = 3;

ls.push(new T(tX-1,tY,3));

mark[tX-1][tY] = 1;

} else {

ls.pop();

maze.mat[tX][tY] = 'Y';

}

}

if ( ls.isEmpty() ){

return false;

} else {

printPath(maze, ls);

return true;

}

}

// 顯示迷宮中的通路

private void printPath(Maze maze, LinkedStack s) {

// 定義一個(gè)棧,按從出口到入口依次進(jìn)棧象缀,出棧輸出即可得到路徑

LinkedStack t = new LinkedStack();

for (int i = 0; i < maze.rowNum; i++) {

maze.mat[i] = Arrays.copyOf(maze.mat[i], maze.mat[i].length);

}

// 由于s的棧頂時(shí)目標(biāo)蔬将,所以先把s中的結(jié)點(diǎn)全部導(dǎo)入到t

while (!s.isEmpty())

t.push(s.pop());

System.out.println("迷宮中的通道路徑為:");

// 輸出路徑,包括行坐標(biāo)央星,列坐標(biāo)霞怀,下一個(gè)位置方向

while (!t.isEmpty()) { // 棧非空,繼續(xù)輸出

T tmp = (T) t.pop();

System.out.print("(" + tmp.x + "莉给," + tmp.y + "毙石,");// 輸出行坐標(biāo),列坐標(biāo)

switch (tmp.dir) // 輸出相應(yīng)的方向

{

case 0:

System.out.println("→)");

maze.mat[tmp.x][tmp.y] = '→';

break;

case 1:

System.out.println("↓)");

maze.mat[tmp.x][tmp.y] = '↓';

break;

case 2:

System.out.println("←)");

maze.mat[tmp.x][tmp.y] = '←';

break;

case 3:

System.out.println("↑)");

maze.mat[tmp.x][tmp.y] = '↑';

break;

}

}

}

// 顯示加載的迷宮內(nèi)容(包括四周的圍欄)颓遏,*代表可通徐矩,#代表不通

private static void printMaze(Maze maze) {

for (int i = 0; i < maze.rowNum; i++) {

for (int j = 0; j < maze.colNum; j++)

System.out.print(maze.mat[i][j]);

System.out.println();

}

}

}

~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市叁幢,隨后出現(xiàn)的幾起案子滤灯,更是在濱河造成了極大的恐慌,老刑警劉巖曼玩,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鳞骤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡黍判,警方通過(guò)查閱死者的電腦和手機(jī)豫尽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)顷帖,“玉大人美旧,你說(shuō)我怎么就攤上這事】咚” “怎么了陈症?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)震糖。 經(jīng)常有香客問(wèn)我录肯,道長(zhǎng),這世上最難降的妖魔是什么吊说? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任论咏,我火速辦了婚禮优炬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘厅贪。我一直安慰自己蠢护,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布养涮。 她就那樣靜靜地躺著葵硕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贯吓。 梳的紋絲不亂的頭發(fā)上懈凹,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音悄谐,去河邊找鬼介评。 笑死,一個(gè)胖子當(dāng)著我的面吹牛爬舰,可吹牛的內(nèi)容都是我干的们陆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼情屹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼坪仇!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起屁商,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤烟很,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后蜡镶,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體雾袱,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年官还,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芹橡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡望伦,死狀恐怖林说,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情屯伞,我是刑警寧澤腿箩,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站劣摇,受9級(jí)特大地震影響珠移,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一钧惧、第九天 我趴在偏房一處隱蔽的房頂上張望暇韧。 院中可真熱鬧,春花似錦浓瞪、人聲如沸懈玻。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)涂乌。三九已至,卻和暖如春钮孵,著一層夾襖步出監(jiān)牢的瞬間骂倘,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工巴席, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人诅需。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓漾唉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親堰塌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赵刑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 回溯算法 回溯法:也稱(chēng)為試探法,它并不考慮問(wèn)題規(guī)模的大小场刑,而是從問(wèn)題的最明顯的最小規(guī)模開(kāi)始逐步求解出可能的答案般此,并...
    fredal閱讀 13,632評(píng)論 0 89
  • Java經(jīng)典問(wèn)題算法大全 /*【程序1】 題目:古典問(wèn)題:有一對(duì)兔子,從出生后第3個(gè)月起每個(gè)月都生一對(duì)兔子牵现,小兔子...
    趙宇_阿特奇閱讀 1,850評(píng)論 0 2
  • 【程序1】 題目:古典問(wèn)題:有一對(duì)兔子铐懊,從出生后第3個(gè)月起每個(gè)月都生一對(duì)兔子,小兔子長(zhǎng)到第三個(gè)月后每個(gè)月又生一對(duì)兔...
    葉總韓閱讀 5,128評(píng)論 0 41
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法瞎疼,類(lèi)相關(guān)的語(yǔ)法科乎,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法贼急,異常的語(yǔ)法茅茂,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,598評(píng)論 18 399
  • 想擁有曼妙的身姿嗎?想擁有高貴的氣質(zhì)嗎太抓?想擁有健康的心態(tài)嗎空闲?美麗的女人們,動(dòng)起來(lái)吧走敌! 加入派瀾舞蹈學(xué)院專(zhuān)業(yè)的舞蹈老...
    sznswudao閱讀 441評(píng)論 0 0