深度優先算法--判斷迷宮的一個起點能否到達一個終點
題目描述:
小老鼠Jerry生活在一個龐大的迷宮裏,每天靠吃奶酪填飽自己的肚子。一天,它發現自己辛辛苦苦攢積的奶酪不見了。於是在迷宮裏開始它的搜尋計劃。迷宮是一個N*M(N,M均不超過20)的棋盤,如下圖所示:
########
#.####.#
#..#..C#
#.M#..##
#..#..##
#.##...#
#......#
########
其中,“#”表示為一堵墻,Jerry是不能呆在上面的;“.”表示為空地,Jerry可以在上面任意經過,可以自由的向上下左右四個方向行走; “M”表示Jerry開始所在的位置,“C”表示奶酪所在的位置。
你的任務是:在輸入中給你迷宮的描述,請問JERRY是否能找回它的奶酪?(也就是
輸入格式:
每個輸入文件有多組數據,以0 0作為結束符。每組數據第一行為N和M表示,迷宮有N行M列。接下來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;
}
運行截圖如下:
深度優先算法--判斷迷宮的一個起點能否到達一個終點