nyoj 21 三個水杯(廣搜)

2021-07-06 03:17:10 字數 1184 閱讀 9288

時間限制:

1000 ms  |  記憶體限制:

65535 kb

難度:4 描述

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

輸入第一行乙個整數n(0v2>v3 v1<100 v3>0)表示三個水杯的體積。

第二行給出三個整數e1 e2 e3 (體積小於等於相應水杯體積)表示我們需要的最終狀態

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

樣例輸入

2

6 3 1

4 1 1

9 3 2

7 1 1

樣例輸出

3

-1

寫了好久,看了大神的思路才寫的,自己好弱!!

#include#include#includeusing namespace std;

#include#include#define n 101

int visit[n][n][n];

struct node

bg,end;

int ac(node p)//判斷是否到達 要求的水的 狀態!

void change(int k,int i,node &r)//將水從i中倒到k中!

int bfs()

{ int i,j,k;

node q,p;

q.con[0]=bg.con[0];

q.con[1]=q.con[2]=0;

q.step =0;

queueq;

q.push(q);

memset(visit,0,sizeof(visit));

visit[q.con[0]][q.con[1]][q.con[2]]=1; //將該狀態標記下

while(!q.empty() )

{ p=q.front();

q.pop();

if(ac(p))

return p.step ;

for(i=0;i<3;i++)

for(j=1;j<3;j++)

{k=(i+j)%3;

if(p.con[i]!=0&&p.con[k]

三個水杯 NYOJ 21(廣搜)

時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 給出三個水杯,大小不一,並且只有最大的水杯的水是裝滿的,其餘兩個為空杯子。三個水杯之間相互倒水,並且水杯沒有標識,只能根據給出的水杯體積來計算。現在要求你寫出乙個程式,使其輸出使初始狀態到達目標狀態的最少次數。輸入 第一行乙個整...

NYOJ 21 三個水杯(bfs,廣搜)

時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 給出三個水杯,大小不一,並且只有最大的水杯的水是裝滿的,其餘兩個為空杯子。三個水杯之間相互倒水,並且水杯沒有標識,只能根據給出的水杯體積來計算。現在要求你寫出乙個程式,使其輸出使初始狀態到達目標狀態的最少次數。輸入第一行乙個整數...

NYOJ21 三個水杯

題目分析 暴力 bfs。將所有可能的狀態壓到佇列中,直到找到目標狀態為止。我自己ac的 include include 三個水杯的盛水的狀態 struct node node queue 100 bool used 101 101 101 inline void pour node p,int ta...