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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

水桶传递队列

發布時間:2023/12/18 编程问答 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 水桶传递队列 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

水桶傳遞隊列

突然想到小學時候玩的推箱子游戲(還拿了科技節全市第一hhh)

推箱子比賽的評判規則就是同一道題誰用的步數少,在步數相同的情況下,用時短的同學獲勝嘿嘿

當時準備比賽的時候,把推箱子所有的關數都破解了!

原來我和計算機的緣分這么早就結下了呀~

題目

農場上起火了,奶牛們正在緊急趕去滅火!

農場可以用一個像這樣的 10×10 的字符方陣來描述:

.......... .......... .......... ..B....... .......... .....R.... .......... .......... .....L.... ..........

字符’B’表示正著火的牛棚,字符’L’表示一個湖,而字符’R’表示農場上的一塊巨大巖石。

奶牛們想要沿著一條湖到牛棚之間的路徑組成一條“水桶傳遞隊列”,這樣她們就可以沿著這條路徑傳遞水桶來幫助滅火。

當兩頭奶牛在東南西北四個方向上相鄰時水桶可以在她們之間傳遞。

湖邊的奶牛也是如此——奶牛只能在緊挨著湖的時候才能用水桶從湖里取水。

類似地,奶牛只能在緊挨著牛棚的時候才能用水去滅牛棚的火。

請幫助求出奶牛們為了組成這樣的“水桶傳遞隊列”需要占據的’.’格子的最小數量。

奶牛不能站在巖石所在的方格之內,此外保證牛棚和湖不是相鄰的。

輸入格式

輸入包含 10 行,每行 10 個字符,描述這個農場的布局。

輸入保證圖案中恰有一個字符’B’、一個字符’L’以及一個字符’R’。

輸出格式

輸出一個整數,為組成一條可行的水桶傳遞隊列所需要的奶牛的最小數量。

輸入樣例:

.......... .......... .......... ..B....... .......... .....R.... .......... .......... .....L.... ..........

輸出樣例:

7

樣例解釋

在這個例子中,以下是一個可行的方案,使用了最小數量的奶牛(7):

.......... .......... .......... ..B....... ..C....... ..CC.R.... ...CCC.... .....C.... .....L.... ..........

思路

Flood Fill (DFS、BFS)

  • 如果起點和終點不在同一行也不在同一列的話,不管障礙物在什么地方,都一定可以找到一條最短路徑,最短路徑的長度就是L和B之間的曼哈頓距離
  • 如果L和B在同一行或同一列,障礙物X不在L和B之間的話,也可以取到理論最小值(曼哈頓距離長度)
  • 如果L和B在同一行或同一列,障礙物X在L和B之間,最短距離為曼哈頓距離+2
  • 注:最后求得的格子數=最短路徑的距離-1

    AC代碼

    #include<iostream> #include<cstdio> #include<cstring> #include<algorithm>using namespace std;int main() {int x1,y1,x2,y2,x3,y3;//x1,y1表示起點;x2,y2表示障礙物;x3,y3表示終點char s[11];//為"\0"留出空間for(int i=0;i<10;i++){cin>>s;for(int j=0;j<10;j++){char c=s[j];if(c=='L'){x1=i,y1=j;}else if(c=='R'){x2=i,y2=j;}else if(c=='B'){x3=i,y3=j;}}} int res=abs(x1-x3)+abs(y1-y3);if(x1==x2&&x2==x3&&(y2-y1)*(y2-y3)<0|| y1==y2&&y2==y3&&(x2-x1)*(x2-x3)<0)//在同一列并且y2在y1與y3之間(相當于 y2-y1 與 y2-y3 符號相反,則(y2-y1)*(y1-y3)<0) {res+=2;} cout<<res-1<<endl;//求的不是最短距離而是起點和終點之間差了多少個格子 //格子數=最短路徑的距離-1 return 0; }

    總結

    以上是生活随笔為你收集整理的水桶传递队列的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。