日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

路痴的单身小菡 BFS求最短路径+DFS求路径数

發(fā)布時間:2024/10/6 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 路痴的单身小菡 BFS求最短路径+DFS求路径数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?路癡的單身小菡

題目描述

小菡很聰明,所以他打ACM非常給力,經(jīng)常偷偷學(xué)習(xí)到深夜。

他是如此的努力學(xué)習(xí),以至于他根本就沒有時間完整的逛過學(xué)校。

有一天,他聽說科大湖的黑天鵝非常好看,由于沒有女朋友,他便獨自一個人去了。

然而他還在專心致志的觀賞黑天鵝,絲毫沒有意識到集訓(xùn)還有 k 分鐘就要開始了,不幸的是剛好小菡是一個路癡。

你覺得他在 k 分鐘內(nèi)可以趕到創(chuàng)客參加集訓(xùn)嗎?

如果可以,他最少要花多少時間才可以回到創(chuàng)客空間參加集訓(xùn)呢?這樣子的路徑有多少條?

輸入

測試數(shù)據(jù)第一組為T(1 <= T <= 100),表示測試樣例組數(shù)。

對于每組測試樣例:

第一行輸入為三個正整數(shù) n m k(1 <= n,m <= 1000,0 <= k <= 10000),n,m表示地圖的長和寬,k表示最多允許花費在路上的時間(在路上花費的時間剛好為k也合法)。

接下來n行輸入地圖,其中包含有符號‘*’、‘#’、‘L’、'C'。

? ? *:表示可以允許走動的空間。

? ? #:表示障礙物,無法走動的空間。

? ? L:表示科大湖,即小菡的起點,保證有且僅有一個。

? ? C:表示創(chuàng)客空間,即小菡的終點,保證有且僅有一個。

小菡走動的計時是從一個空間到另一個空間為一分鐘。開始時,小菡已經(jīng)站在了起點上。當移動時間等于k時剛好到達終點依然視為合法。

(注意:小菡只能往上下左右四個方向走動。)

?

輸出

輸出形式為“Case #x: ”(不包含引號),x表示對應(yīng)第x個樣例。

如果小菡在 k 分鐘內(nèi)無法回到創(chuàng)客,則輸出-1。

否則,輸出小菡回到創(chuàng)客花費的最短時間,和滿足該最短時間的路徑條數(shù)。

樣例輸入

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; }

?

總結(jié)

以上是生活随笔為你收集整理的路痴的单身小菡 BFS求最短路径+DFS求路径数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。