路痴的单身小菡 BFS求最短路径+DFS求路径数
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?路癡的單身小菡
題目描述
小菡很聰明,所以他打ACM非常給力,經常偷偷學習到深夜。
他是如此的努力學習,以至于他根本就沒有時間完整的逛過學校。
有一天,他聽說科大湖的黑天鵝非常好看,由于沒有女朋友,他便獨自一個人去了。
然而他還在專心致志的觀賞黑天鵝,絲毫沒有意識到集訓還有 k 分鐘就要開始了,不幸的是剛好小菡是一個路癡。
你覺得他在 k 分鐘內可以趕到創客參加集訓嗎?
如果可以,他最少要花多少時間才可以回到創客空間參加集訓呢?這樣子的路徑有多少條?
輸入
測試數據第一組為T(1 <= T <= 100),表示測試樣例組數。
對于每組測試樣例:
第一行輸入為三個正整數 n m k(1 <= n,m <= 1000,0 <= k <= 10000),n,m表示地圖的長和寬,k表示最多允許花費在路上的時間(在路上花費的時間剛好為k也合法)。
接下來n行輸入地圖,其中包含有符號‘*’、‘#’、‘L’、'C'。
? ? *:表示可以允許走動的空間。
? ? #:表示障礙物,無法走動的空間。
? ? L:表示科大湖,即小菡的起點,保證有且僅有一個。
? ? C:表示創客空間,即小菡的終點,保證有且僅有一個。
小菡走動的計時是從一個空間到另一個空間為一分鐘。開始時,小菡已經站在了起點上。當移動時間等于k時剛好到達終點依然視為合法。
(注意:小菡只能往上下左右四個方向走動。)
?
輸出
輸出形式為“Case #x: ”(不包含引號),x表示對應第x個樣例。
如果小菡在 k 分鐘內無法回到創客,則輸出-1。
否則,輸出小菡回到創客花費的最短時間,和滿足該最短時間的路徑條數。
樣例輸入
4 2 2 3 L* *C 4 4 10 L*** **** **** ***C 4 4 8 L*## #*** ###* C*** 4 4 10 L*## #*** ###* C***樣例輸出
Case #1: 2 2 Case #2: 6 20 Case #3: -1 Case #4: 9 1 #include<cstdio> #include<iostream> #include<queue> using namespace std; const int maxn = 1005; char mp[maxn][maxn]; int dis[maxn][maxn]; //初始化距離矩陣,0代表起點,-1代表墻,n代表從起點到這一點的距離(n=1,2,3...n) int t,n,m,k,cnt; struct node{int x,y,n;node(int a,int b,int c){x = a,y = b,n = c;} }; // void find(int x,int y){if(x >= 0 && x < n && y >= 0 && y < m){if(mp[x][y] == 'L'){cnt++;return;}if(dis[x][y] == -1) return;if(dis[x + 1][y] + 1 == dis[x][y])find(x + 1,y);if(dis[x - 1][y] + 1 == dis[x][y])find(x - 1,y);if(dis[x][y + 1] + 1 == dis[x][y])find(x,y + 1);if(dis[x][y - 1] + 1 == dis[x][y])find(x,y - 1);} } void bfs(int x,int y){queue<node> q;node p(x,y,0);q.push(p);while(!q.empty()){p = q.front();q.pop();if(mp[p.x][p.y] != '#' && p.x >= 0 && p.x < n && p.y >= 0 && p.y < m && dis[p.x][p.y] == -1){if(mp[p.x][p.y] == 'C'){if(dis[p.x][p.y] != -1 && p.n > dis[p.x][p.y]) return;dis[p.x][p.y] = p.n;}else{dis[p.x][p.y] = p.n;{node temp(p.x + 1,p.y,p.n + 1);q.push(temp);}{node temp(p.x - 1,p.y,p.n + 1);q.push(temp);}{node temp(p.x,p.y + 1,p.n + 1);q.push(temp);}{node temp(p.x,p.y - 1,p.n + 1);q.push(temp);}}}}} int main() {scanf("%d",&t);for(int Case = 1;Case <= t; Case++){scanf("%d %d %d",&n,&m,&k);for(int i = 0;i < n; i++){scanf("%s",mp[i]);fill(dis[i],dis[i] + maxn, -1);}int sx,sy,ex,ey;for(int i = 0;i < m; i++){for(int j = 0;j < m; j++){if(mp[i][j] == 'L'){sx = i;sy = j;}if(mp[i][j] == 'C'){ex = i;ey = j;}}}bfs(sx,sy);if(dis[ex][ey] > k || dis[ex][ey] == -1) printf("Case #%d: -1\n",Case);else{cnt = 0;//輸出距離矩陣/*for(int i = 0;i < n ;i++){for(int j = 0;j < m; j++){printf("%d ",dis[i][j]);}printf("\n");}*/find(ex,ey);//從終點向起點搜索printf("Case #%d: %d %d\n",Case,dis[ex][ey],cnt);}}return 0; }?
總結
以上是生活随笔為你收集整理的路痴的单身小菡 BFS求最短路径+DFS求路径数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Wappo BFS求最短路+路径记录
- 下一篇: 复原二叉树