1. 程式人生 > >深度優先算法--判斷迷宮的一個起點能否到達一個終點

深度優先算法--判斷迷宮的一個起點能否到達一個終點

char blog 否則 枚舉 src 計劃 sca 深度優先 一個起點

題目描述:

小老鼠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;
}

運行截圖如下:

技術分享

深度優先算法--判斷迷宮的一個起點能否到達一個終點