日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發布時間:2025/7/14 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度优先算法--判断迷宫的一个起点能否到达一个终点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述:

小老鼠Jerry生活在一個龐大的迷宮里,每天靠吃奶酪填飽自己的肚子。一天,它發現自己辛辛苦苦攢積的奶酪不見了。于是在迷宮里開始它的搜尋計劃。迷宮是一個N*MNM均不超過20)的棋盤,如下圖所示:

########

#.####.#

#..#..C#

#.M#..##

#..#..##

#.##...#

#......#

########

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

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

輸入格式:

每個輸入文件有多組數據,以0 0作為結束符。每組數據第一行為NM表示,迷宮有NM列。接下來N行,每行M個字符描述著迷宮的形狀。

輸出格式:

對于每組數據,如果JERRY能找到奶酪,就輸出“^_^”,否則輸出“-_-”。每組數據的結果占據一行。

示例:

輸入

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];

// 起點坐標
int startx = 1;
int starty = 1;
// 終點坐標
int finalx = 1;
int finaly = 1;


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

// 判斷是否到達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;
}
// 判斷是否為障礙物或者已經再路徑中
if ( a[tx][ty]=='.' && book[tx][ty]==0 ){
book[tx][ty] = 1; // 標記這個點已經走過
dfs(tx,ty,step+1); // 開始嘗試下一個點
book[tx][ty] = 0; // 嘗試結束,取消這個點的標記
}
}
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();
}

// 讀入起點和終點坐標
// scanf("%d %d %d %d",&startx,&starty,&p,&q);

// 找起點坐標

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


// 從起點開始搜索
book[startx][starty] = 1; // 標記起點再路徑中,防止后面重復走


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("最少可以經過%d步找到奶酪\n",min);
}else{
printf("不能找到奶酪!\n");
printf("__ __\n");
printf("\n");
printf(" __ \n\n");
}

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

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

?

運行截圖如下:

?

轉載于:https://www.cnblogs.com/ncuhwxiong/p/7073439.html

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。