水桶传递队列
水桶傳遞隊列
突然想到小學時候玩的推箱子游戲(還拿了科技節全市第一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)
注:最后求得的格子數=最短路徑的距離-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; }總結
- 上一篇: centos7系统开启ftp服务器,ce
- 下一篇: 【leetcode729:我的日程安排表