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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[ACM_NYOJ_21]三个水杯(BFS广度优先搜索)

發布時間:2025/4/14 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [ACM_NYOJ_21]三个水杯(BFS广度优先搜索) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

三個水杯

時間限制:1000 ms | 內存限制:65535 KB
難度:4

描述
給出三個水杯,大小不一,并且只有最大的水杯的水是裝滿的,其余兩個為空杯子。三個水杯之間相互倒水,并且水杯沒有標識,只能根據給出的水杯體積來計算。現在要求你寫出一個程序,使其輸出使初始狀態到達目標狀態的最少次數。


輸入
第一行一個整數N(0V2>V3 V10)表示三個水杯的體積。
第二行給出三個整數E1 E2 E3 (體積小于等于相應水杯體積)表示我們需要的最終狀態。


輸出
每行輸出相應測試數據最少的倒水次數。如果達不到目標狀態輸出-1


樣例輸入
2
6 3 1
4 1 1
9 3 2
7 1 1


樣例輸出
3
-1


來源
NYOJ21


這道題是廣度優先搜索,其實也是暴利破解,窮舉所有情況,找到的話就返回步數,否則返回-1。

#include<stdio.h> #include<memory.h> #include<algorithm> #include<queue> using namespace std; bool visit[105][105][105]; struct s{ int a, b, c, step; s(int a = 0, int b = 0, int c = 0, int step = 0):a(a), b(b), c(c), step(step){} }; int bfs(s V, s E){ s B; B.a = V.a; memset(visit, 0, sizeof(visit)); visit[V.a][0][0] = 1; queue<s> q; q.push(B); while(!q.empty()){ s F = q.front(); if(F.a == E.a && F.b == E.b && F.c == E.c){ return F.step; } q.pop(); if(F.a > 0 && F.b < V.b){ //a->b s S; int v = min(F.a, V.b - F.b); S.a = F.a - v; S.b = F.b + v; S.c = F.c; S.step = F.step + 1; if(!visit[S.a][S.b][S.c]){ visit[S.a][S.b][S.c] = 1; q.push(S); } } if(F.a > 0 && F.c < V.c){ //a->c s S; int v = min(F.a, V.c - F.c); S.a = F.a - v; S.c = F.c + v; S.b = F.b; S.step = F.step + 1; if(!visit[S.a][S.b][S.c]){ visit[S.a][S.b][S.c] = 1; q.push(S); } } if(F.b > 0 && F.c < V.c){ //b->c s S; int v = min(F.b, V.c - F.c); S.b = F.b - v; S.c = F.c + v; S.a = F.a; S.step = F.step + 1; if(!visit[S.a][S.b][S.c]){ visit[S.a][S.b][S.c] = 1; q.push(S); } } if(F.b > 0 && F.a < V.a){ //b->a s S; int v = min(F.b, V.a - F.a); S.b = F.b - v; S.a = F.a + v; S.c = F.c; S.step = F.step + 1; if(!visit[S.a][S.b][S.c]){ visit[S.a][S.b][S.c] = 1; q.push(S); } } if(F.c > 0 && F.a < V.a){ //c->a s S; int v = min(F.c, V.a - F.a); S.c = F.c - v; S.a = F.a + v; S.b = F.b; S.step = F.step + 1; if(!visit[S.a][S.b][S.c]){ visit[S.a][S.b][S.c] = 1; q.push(S); } } if(F.c > 0 && F.b < V.b){ //c->b s S; int v = min(F.c, V.b - F.b); S.c = F.c - v; S.b = F.b + v; S.a = F.a; S.step = F.step + 1; if(!visit[S.a][S.b][S.c]){ visit[S.a][S.b][S.c] = 1; q.push(S); } } } return -1; } int main(){ int T; scanf("%d", &T); while(T--){ s V; s E; scanf("%d%d%d", &V.a, &V.b, &V.c); scanf("%d%d%d", &E.a, &E.b, &E.c); printf("%d\n", bfs(V, E)); } return 0; }

=======================簽 名 檔=======================
原文地址(我的博客):http://lanfei.sinaapp.com/2012/04/659.html
歡迎訪問交流,至于我為什么要多弄一個博客,因為我熱愛前端,熱愛網頁,我更希望有一個更加自由、真正屬于我自己的小站,或許并不是那么有名氣,但至少能夠讓我為了它而加倍努力。。
=======================簽 名 檔=======================


轉載于:https://www.cnblogs.com/springside6/archive/2012/04/17/2525068.html

總結

以上是生活随笔為你收集整理的[ACM_NYOJ_21]三个水杯(BFS广度优先搜索)的全部內容,希望文章能夠幫你解決所遇到的問題。

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