資料結構練習題――Hero In Maze 簡單版(JSU-ZJJ)
阿新 • • 發佈:2018-12-08
題目描述
500年前,Jesse是我國最卓越的劍客。他英俊瀟灑,而且機智過人_。
突然有一天,Jesse心愛的公主被魔王困在了一個巨大的迷宮中。Jesse聽說這個訊息已經是兩天以後了,他急忙趕到迷宮,開始到處尋找公主的下落。
請你判斷他是否能救出心愛的公主。(假設有路可以通到公主那就可以找到公主)。
輸入
題目包括多組測試資料。
每組測試資料以兩個整數n,m(0<n, m≤20)開頭,分別代表迷宮的長和高。緊接著有m行,n列字元,由".","",“P”,"S"組成。其中
“.” 代表能夠行走的空地。
"" 代表牆壁,Jesse不能從此通過。
“P” 是公主所在的位置。
“S” 是Jesse的起始位置。
Jesse只能選擇“上、下、左、右”任意一方向走一步。
輸入以0 0結束。
輸出
如果能救出公主輸出“YES”,否則輸出“NO”。
分析:
本題十分明顯的深搜,不過,對於我這種剛學深索不久的人來說。 本題的難度還是十分大的。本題的思路大致就是為全部依次走,如果能找到公主,就可以推出了;
如下程式碼:
#include"stdio.h" int px,py,n,m,biaoji;char a[25][25],t; int dfs(int sx,int sy) { if(sx<0||sy<0||sx>=m||sy>=n||px<0||py<0||px>=m||py>=n||a[sx][sy]=='*')/*代表這個點不可以被走,所以退出來*/ return 0; if(sx==px&&sy==py)//代表到了終點 return 1; a[sx][sy]='*';//經過上面兩個if後,代表著這個點可走。此為標記為舊點 if(dfs(sx-1,sy)==1)//向上走 return 1; // if(sx-1>=0) // a[sx-1][sy]='*'; // a[sx][sy]='*'; // if(biaoji==0) if(dfs(sx+1,sy)==1) return 1; // if(sx+1<n) // a[sx+1][sy]='*'; // a[sx][sy]='*'; // if(biaoji==0) if(dfs(sx,sy-1)==1) return 1; // if(sy-1>=0) // a[sx][sy-1]='*'; // a[sx][sy]='*'; // if(biaoji==0) if(dfs(sx,sy+1)==1) return 1; // if(sy+1<m) // a[sx][sy+1]='*'; // a[sx][sy]='*'; return 0;/*/如果上面操作,未能return,則表示這個點不能到達公主那。直接return 0到上一個遞迴。考慮*/ } int main() { int sx,sy,i,j; while(~scanf("%d%d",&n,&m)) {if(n==0&&m==0) break; biaoji=0; // for(i=0;i<25;i++) // for(j=0;j<25;j++) // { // a[i][j]='.'; // } // printf("%d %d\n",n,m); scanf("%c",&t); for(i=0;i<m;i++) {for(j=0;j<n;j++) {scanf("%c",&a[i][j]); if(a[i][j]=='S') { sx=i;sy=j; } if(a[i][j]=='P') { px=i;py=j; } } scanf("%c",&t); } //printf("%d %d\n%d %d\n",sx,sy,px,py); /* for(i=0;i<n;i++) {for(j=0;j<m;j++) printf("%c ",a[i][j]); printf("\n");}*/ if(dfs(sx,sy)==1) printf("YES\n"); else printf("NO\n"); } }