[ACM_NYOJ_21]三个水杯(BFS广度优先搜索)
三個水杯
時間限制:1000 ms | 內(nèi)存限制:65535 KB
難度:4
描述
給出三個水杯,大小不一,并且只有最大的水杯的水是裝滿的,其余兩個為空杯子。三個水杯之間相互倒水,并且水杯沒有標(biāo)識,只能根據(jù)給出的水杯體積來計算。現(xiàn)在要求你寫出一個程序,使其輸出使初始狀態(tài)到達(dá)目標(biāo)狀態(tài)的最少次數(shù)。
輸入
第一行一個整數(shù)N(0V2>V3 V10)表示三個水杯的體積。
第二行給出三個整數(shù)E1 E2 E3 (體積小于等于相應(yīng)水杯體積)表示我們需要的最終狀態(tài)。
輸出
每行輸出相應(yīng)測試數(shù)據(jù)最少的倒水次數(shù)。如果達(dá)不到目標(biāo)狀態(tài)輸出-1
樣例輸入
2
6 3 1
4 1 1
9 3 2
7 1 1
樣例輸出
3
-1
來源
NYOJ21
這道題是廣度優(yōu)先搜索,其實也是暴利破解,窮舉所有情況,找到的話就返回步數(shù),否則返回-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
歡迎訪問交流,至于我為什么要多弄一個博客,因為我熱愛前端,熱愛網(wǎng)頁,我更希望有一個更加自由、真正屬于我自己的小站,或許并不是那么有名氣,但至少能夠讓我為了它而加倍努力。。
=======================簽 名 檔=======================
轉(zhuǎn)載于:https://www.cnblogs.com/springside6/archive/2012/04/17/2525068.html
總結(jié)
以上是生活随笔為你收集整理的[ACM_NYOJ_21]三个水杯(BFS广度优先搜索)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: forward、redirect、浏览器
- 下一篇: 读《三双鞋》启示录