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

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

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

深度优先算法--判断迷宫的一个起点能否到达一个终点

發(fā)布時(shí)間:2025/7/14 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度优先算法--判断迷宫的一个起点能否到达一个终点 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目描述:

小老鼠Jerry生活在一個(gè)龐大的迷宮里,每天靠吃奶酪填飽自己的肚子。一天,它發(fā)現(xiàn)自己辛辛苦苦攢積的奶酪不見(jiàn)了。于是在迷宮里開(kāi)始它的搜尋計(jì)劃。迷宮是一個(gè)N*MNM均不超過(guò)20)的棋盤(pán),如下圖所示:

########

#.####.#

#..#..C#

#.M#..##

#..#..##

#.##...#

#......#

########

其中,“#”表示為一堵墻,Jerry是不能呆在上面的;.”表示為空地,Jerry可以在上面任意經(jīng)過(guò),可以自由的向上下左右四個(gè)方向行走; M”表示Jerry開(kāi)始所在的位置,“C”表示奶酪所在的位置。

你的任務(wù)是:在輸入中給你迷宮的描述,請(qǐng)問(wèn)JERRY是否能找回它的奶酪?(也就是JERRY不穿過(guò)墻,只在空地上行走,是否存在一條從開(kāi)始位置到奶酪所在位置的一條道路)。

輸入格式:

每個(gè)輸入文件有多組數(shù)據(jù),以0 0作為結(jié)束符。每組數(shù)據(jù)第一行為NM表示,迷宮有NM列。接下來(lái)N行,每行M個(gè)字符描述著迷宮的形狀。

輸出格式:

對(duì)于每組數(shù)據(jù),如果JERRY能找到奶酪,就輸出“^_^”,否則輸出“-_-”。每組數(shù)據(jù)的結(jié)果占據(jù)一行。

示例:

輸入

8 8

########

#M####.#

#..#..C#

#..#..##

#..#..##

#.##...#

#......#

########

3 5

#####

#M#C#

#####

0 0

輸出

??^_^

??-_-

代碼如下:

?

#include <stdio.h>
#include <stdlib.h>

int n,m,min=99999999,flag=0;
char a[21][21],book[21][21];

// 起點(diǎn)坐標(biāo)
int startx = 1;
int starty = 1;
// 終點(diǎn)坐標(biāo)
int finalx = 1;
int finaly = 1;


void dfs(int x,int y,int step){
// 定義一個(gè)方向數(shù)組
int next[4][2] = {
{ 0, 1}, // 向右走
{ 1,0 }, // 向下走
{ 0, -1 }, // 向左走
{ -1,0 } // 向上走
};
int tx,ty,k;

// 判斷是否到達(dá)C
if ( x==finalx && y==finaly) {
if(step<min){
min = step;
flag=1;
}
return ;
}

// 枚舉四種走法
for( k=0;k<=3;k++ ){
tx = x+next[k][0];
ty = y+next[k][1];

// 判斷是否越界
if (tx<1 || tx > n || ty<1 || ty>m ) {
continue;
}
// 判斷是否為障礙物或者已經(jīng)再路徑中
if ( a[tx][ty]=='.' && book[tx][ty]==0 ){
book[tx][ty] = 1; // 標(biāo)記這個(gè)點(diǎn)已經(jīng)走過(guò)
dfs(tx,ty,step+1); // 開(kāi)始嘗試下一個(gè)點(diǎn)
book[tx][ty] = 0; // 嘗試結(jié)束,取消這個(gè)點(diǎn)的標(biāo)記
}
}
return ;
}
int main()
{
int i,j;
// 輸入n和m,n為行,m為列
scanf("%d%d",&n,&m);
getchar();
while(n!=0&&m!=0){
// 讀入迷宮
for(i=1;i<=n;i++) {
for(j=1;j<=m;j++){
scanf("%c",&a[i][j]);
}
getchar();
}

// 讀入起點(diǎn)和終點(diǎn)坐標(biāo)
// scanf("%d %d %d %d",&startx,&starty,&p,&q);

// 找起點(diǎn)坐標(biāo)

for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
if(a[i][j]=='M'){
startx=i;
starty=j;
a[i][j]='.';
}
}
}
// 找終點(diǎn)坐標(biāo)
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
if(a[i][j]=='C'){
finalx=i;
finaly=j;
a[i][j]='.';
}
}
}


// 從起點(diǎn)開(kāi)始搜索
book[startx][starty] = 1; // 標(biāo)記起點(diǎn)再路徑中,防止后面重復(fù)走


dfs(startx,starty,0);

printf("JERRY的位置為:%d %d\n",startx,starty);
printf("奶酪的位置為:%d %d\n",finalx,finaly);

if(flag){
printf("^^ ^^\n");
printf(" __\n\n");
printf("最少可以經(jīng)過(guò)%d步找到奶酪\n",min);
}else{
printf("不能找到奶酪!\n");
printf("__ __\n");
printf("\n");
printf(" __ \n\n");
}

scanf("%d%d",&n,&m);
getchar();
// 起點(diǎn)坐標(biāo)
startx = 1;
starty = 1;
// 終點(diǎn)坐標(biāo)
finalx = 1;
finaly = 1;
flag = 0;
}

getchar();getchar();
return 0;
}

?

運(yùn)行截圖如下:

?

轉(zhuǎn)載于:https://www.cnblogs.com/ncuhwxiong/p/7073439.html

總結(jié)

以上是生活随笔為你收集整理的深度优先算法--判断迷宫的一个起点能否到达一个终点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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