王子救公主
阿新 • • 發佈:2018-12-08
題目描述
可憐的公主在一次次被魔王擄走一次次被騎士們救回來之後,而今,不幸的她再一次面臨生命的考驗。魔王已經發出訊息說將在T時刻吃掉公主,因為他聽信謠言說吃公主的肉也能長生不老。年邁的國王正是心急如焚,告招天下勇士來拯救公主。不過公主早已習以為常,她深信智勇的騎士LJ肯定能將她救出。
現據密探所報,公主被關在一個兩層的迷宮裡,迷宮的入口是S(x, y),公主的位置用P表示。
輸入
測試資料多組。輸入n, m;表示nm的迷宮, S為入口,P為公主位置,”“表示可以通行,”.“表示不可通行。
輸出
如果王子可以順利救到公主輸出王子救到公主的最短距離,和YES。如果不行輸出NO
樣例輸入
3 4
S…*
…
***P
樣例輸出
5
YES
分析:
本題與其他深搜問題沒什麼大的區別。本題也可以用bfs做。
#include"stdio.h" int px,py,n,m,biaoji; char a[25][25],t; int min1,count; int min(int a,int b) { if(a<b) return a; else return b; } int dfs(int sx,int sy,int count) { if(sx<0||sy<0||sx>=n||sy>=m||px<0||py<0||px>=n||py>=m||a[sx][sy]=='.') return 0; if(sx==px&&sy==py) { min1=min(min1,count); return 0; } a[sx][sy]='.'; dfs(sx-1,sy,count+1); // return 1; // if(sx-1>=0) // a[sx-1][sy]='*'; // a[sx][sy]='*'; // if(biaoji==0) dfs(sx+1,sy,count+1); // return 1; // if(sx+1<n) // a[sx+1][sy]='*'; // a[sx][sy]='*'; // if(biaoji==0); dfs(sx,sy-1,count+1); // return 1;; // if(sy-1>=0) // a[sx][sy-1]='*'; // a[sx][sy]='*'; // if(biaoji==0) dfs(sx,sy+1,count+1); // return 1; // if(sy+1<m) // a[sx][sy+1]='*'; a[sx][sy]='*'; return 0; } int main() { int sx,sy,i,j; while(~scanf("%d%d",&n,&m)) {min1=1000;count=0; 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<n;i++) {for(j=0;j<m;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");}*/ dfs(sx,sy,count); if(min1!=1000) { printf("%d\n",min1); printf("YES\n");} else printf("NO\n"); } }