1. 程式人生 > >ACM--三個水杯

ACM--三個水杯

三個水杯

時間限制:1000 ms  |  記憶體限制:65535 KB 難度:4
描述
給出三個水杯,大小不一,並且只有最大的水杯的水是裝滿的,其餘兩個為空杯子。三個水杯之間相互倒水,並且水杯沒有標識,只能根據給出的水杯體積來計算。現在要求你寫出一個程式,使其輸出使初始狀態到達目標狀態的最少次數。
輸入
第一行一個整數N(0<N<50)表示N組測試資料
接下來每組測試資料有兩行,第一行給出三個整數V1 V2 V3 (V1>V2>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<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;

struct Node
{
    int a,b,c;
    int step;
    Node()
    {
        step=0;
    }
};
int Max[3];//剛開始水杯中最大的容量
int Cur[3];//水杯中目前的狀態
int End[3];//最終水杯要到達的狀態
int step;
bool b[100][100][100]= {0};

void pourWater(int i, int j)//i往j倒水
{
    if(Cur[i]==0||Cur[j]==Max[j])//如果i中沒有水或者杯子已經滿了
        return;
    if(Cur[i]>Max[j]-Cur[j])//如果i中水倒不完
    {
        Cur[i]=Cur[i]-(Max[j]-Cur[j]);
        Cur[j]=Max[j];
    }
    else//如果i中水不夠到
    {
        Cur[j]=Cur[i]+Cur[j];
        Cur[i]=0;
    }
}

//廣度優先搜尋主要思想:
//剛開始的水杯中水的狀態記為node,把node加入到佇列中
//從這個狀態開始,有6中倒水狀態,分別給初始狀態進行倒水,
//把符合條件的倒水後的水杯中水的狀態加入到佇列中,
//直到找到最後需要的狀態。
void bfs()
{
    queue<Node> q;
    Node node,cur;
    step=-1;
    node.a=Max[0];
    node.b=0;
    node.c=0;
    q.push(node);
    b[node.a][node.b][node.c]=1;
    while(!q.empty())
    {
        node = cur = q.front();
        q.pop();
        Cur[0]=cur.a;
        Cur[1]=cur.b;
        Cur[2]=cur.c;

        if(Cur[0]==End[0]&&Cur[1]==End[1]&&Cur[2]==End[2])
        {
            step=cur.step;
            break;
        }
        for(int i=0; i<3; i++)
        {
            for(int j=0; j<3; j++)
            {
                if(i!=j&&Cur[i]!=0&&Cur[j]!=Max[j])
                {
                    pourWater(i,j);
                    if(!b[Cur[0]][Cur[1]][Cur[2]])
                    {
                        b[Cur[0]][Cur[1]][Cur[2]]=true;
                        cur.a=Cur[0],cur.b=Cur[1],cur.c=Cur[2];
                        cur.step++;
                        q.push(cur);
                    }
                    cur=node;
                    Cur[0]=cur.a;
                    Cur[1]=cur.b;
                    Cur[2]=cur.c;
                }
            }
        }
    }
}
int main()
{
    int m;
    cin >> m;
    while(m--)
    {
        memset(b,0,sizeof(b));
        memset(Cur,0,sizeof(Cur));
        memset(End,0,sizeof(End));
        cin >> Max[0] >> Max[1] >> Max[2];
        cin >> End[0] >> End[1] >> End[2];
        Cur[0]=Max[0];
        bfs();
        cout << step << endl;
    }
}

相關推薦

ACM--水杯

三個水杯 時間限制:1000 ms  |  記憶體限制:65535 KB 難度:4 描述 給出三個水杯,大小不一,並且只有最大的水杯的水是裝滿的,其餘兩個為空杯子。三個水杯之間相互倒水,並且水杯沒有標識,只能根據給出的水杯體積來計算。現在要求你寫出一個程式,使其輸出使初

水杯(BFS)

post pos acm class .net 一行 ora sea ref 三個水杯 時間限制:1000 ms | 內存限制:65535 KB 難度:4 描寫敘述給出三個水杯。大小不一,而且僅僅有最大的水杯的水是裝滿的,其余兩

nyoj 21 水杯

light spa ems 相互 site define front pan 測試 三個水杯 時間限制:1000 ms | 內存限制:65535 KB 難度:4 描述 給出三個水杯,大小不一,並且只有最大的水杯的水是裝滿的,其余兩個為空杯子。三個水杯之間相互倒水,並且水

水杯

時間 並且 ret lin tar arch 輸出 nbsp void 三個水杯 時間限制:1000 ms | 內存限制:65535 KB 難度:4 描述給出三個水杯,大小不一,並且只有最大的水杯的水是裝滿的,其余兩個為空杯子。三個水杯之間相互倒水,並且水杯沒有

NYOJ21.水杯-初始態到目標態的最少次數-經典BFS

限制 bsp ref mem pre code time can 大小 題目傳送門:biubiubiu~ 三個水杯 時間限制:1000 ms | 內存限制:65535 KB 難度:4 描述給出三個水杯,大小不一,並且只有最大的水杯的水是裝滿的,其余兩個為空杯子

NYOJ #21 水杯(bfs)

描述 給出三個水杯,大小不一,並且只有最大的水杯的水是裝滿的,其餘兩個為空杯子。三個水杯之間相互倒水,並且水杯沒有標識,只能根據給出的水杯體積來計算。現在要求你寫出一個程式,使其輸出使初始狀態到達目標狀態的最少次數。 輸入 第一行一個整數N(0<N<50)表示N組測試資料接下來每組測試資料有

NYOJ 21 水杯(BFS)

題目:http://acm.nyist.net/JudgeOnline/problem.php?pid=21 題意很明確 #include<cstdio> #include<cstring> #include<queue> #in

A - 水杯 ~ BFS ~

題目描述 給出三個水杯,大小不一,並且只有最大的水杯的水是裝滿的,其餘兩個為空杯子。三個水杯之間相互倒水,並且水杯沒有標識,只能根據給出的水杯體積來計算。現在要求你寫出一個程式,使其輸出使初始狀態到達目標狀態的最少次數。 輸入 第一行一個整數N(0<N<50)表示N組測試資料

1117-水杯

1117 - 三個水杯 時間限制:1秒 記憶體限制:128兆 題目描述 給出三個水杯,大小不一,並且只有最大的水杯的水是裝滿的,其餘兩個為空杯子。三個水杯之間相互倒水,並且水杯沒有標識,只能根據給出的水杯體積來計算。現在要求你寫出一個程式,使其輸出使初始狀態到達目標狀態的最少次數。

ACM21 水杯-Java

三個水杯 時間限制:1000 ms  |  記憶體限制:65535 KB 難度:4 描述給出三個水杯,大小不一,並且只有最大的水杯的水是裝滿的,其餘兩個為空杯子。三個水杯之間相互倒水,並且水杯沒有標識,只能根據給出的水杯體積來計算。現在要求你寫出一個程式,使其

javascript中不易分清的slice,splice和split函數

也會 www d參數 keyword str pac 說明 截取 tab 1.slice(數組) 用法:array.slice(start,end) 解釋:該方法是對數組進行部分截取,並返回一個數組副本;參數start是截取的開始數組索引,end參數等於你要取的最後一個字符

js中addEventListener第參數涉及到的事件捕獲與冒泡

等等 觸發 不同 ntb 兩個 冒泡 load 觸摸 dom js中,我們可以給一個dom對象添加監聽事件,函數就是 addEventListener("click",function(){},true); 很容易理解,第一個參數是事件類型,比如點擊(click)、觸摸(t

js字符串編碼編碼的區別

跳轉 進行 sca escape com js字符串 傳遞 字符 目的 1、escape():編碼目的為了防止字符串中特殊字符造成運算錯誤,主要在字符串運算中使用; 不進行編碼的69個字符:[email protected]/* */*、_、+、-、.、\。 2

離線安裝docker最新版,記得要以下包。

oar btool 最新版 刪除 html root images ges con 如果安裝了以前版本,還要刪除以下這個包。 container-selinux.noarch 2:2.10-2.el7 ============== 離線安裝三個rpm -rw-r--

after、append和appendTo函數的區別

after bsp text str rep 區別 實例 用法 tle jq文檔的說明是 1、after函數 定義和用法: after() 方法在被選元素後插入指定的內容。 語法: $(selector).after(content) 實例: <html><

python學習第

cat 自定義函數 min 類型 一個 默認參數 變長參數 是個 分隔 ##########################python 第三章 ################################這一章呢,主要是文件的操作,還有涉及到函數的一部分. PS:整理

Linux文件的時間概念

linux系統保存了這三個時間,分別是Accesstime(訪問時間),Modify time(修改時間)和Change time(狀態時間)。官方文檔給出的解釋: st_atime Time when file datawas last accessed. Changed by

安提瓜月獲批入籍

吸引 每年 .cn 歐盟 新加坡 澳門 海水 com 天堂 安提瓜和巴布達臨近美國,是加勒比海的一個島國,其清澈的海水和怡人的環境吸引著無數遊客前來度假。安提瓜護照,投資金額少、審批快、直接入籍、免簽國眾多。安提瓜護照是英聯邦國家護照,不僅免簽申根區、英國等歐盟國家,作為英

消息:SQL Server 2017(vNext)的第公開的CTP(社區技術預覽版)發布了

start spn system 看到了 一個 get creat 社區 目前 今天看到了一個新聞,跟大家分享一下,有興趣的可以去嘗試一下。 SQL Server 2017 CTP3於5月23日發布了,詳細版本號是6.7.55.0。 大家可以去安裝試試。在下載頁面,目前是S

給學習Linux系統小白的兩建議

性價比 linux 前段時間看過一個針對國內Linux使用情況的調研表,有了不少感慨。現在聽說過linux,會一點linux基本操作的人多如牛毛,然而真正能用linux做一點事情的確少之又少。無論是公司還是學校,辦公基本上都基於win。這也造成了國人不習慣接觸linux的主要原因。看到好多人,學了點基