程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> NYOJ21 三個水杯 (經典問題 bfs)

NYOJ21 三個水杯 (經典問題 bfs)

編輯:關於C++

 

給出三個水杯,大小不一,並且只有最大的水杯的水是裝滿的,其余兩個為空杯子。三個水杯之間相互倒水,並且水杯沒有標識,只能根據給出的水杯體積來計算。現在要求你寫出一個程序,使其輸出使初始狀態到達目標狀態的最少次數。
輸入第一行一個整數N(0 接下來每組測試數據有兩行,第一行給出三個整數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

題目分析:

經典題目,bfs搜索,不用回溯,直接暴力即可。

AC代碼:

 

 
/**
 *bfs,隱式圖的搜索
 */
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int vis[101][101][101];//記錄是否被訪問
struct StateNode{
    int cur[3];//記錄當前狀態
    int v[3];//記錄狀態
    int step;//步數
};
queue q;
int Sucess(StateNode a,StateNode b){//比較是否相等
    return (a.cur[0] == b.cur[0] && a.cur[1] == b.cur[1] && a.cur[2] == b.cur[2]);
}
int main()
{
    int t,res;
    StateNode b,e;
    cin>>t;
    while(t--){
        res=-1;
        while(!q.empty()){//清空隊列
            q.pop();
        }
        cin>>b.v[0]>>b.v[1]>>b.v[2];
        //下面開始模擬倒水,並搜索
        b.cur[0]=b.v[0];//首先先給最大的水杯倒滿水
        b.cur[1]=b.cur[2]=0;//小杯子為0
        b.step=0;//記錄步數

        cin>>e.cur[0]>>e.cur[1]>>e.cur[2];

        int ok=0;//記錄是否可以到達結尾狀態
        memset(vis,0,sizeof(vis));
        q.push(b);//加入隊列
        vis[b.cur[0]][b.cur[1]][b.cur[2]]=1;//已經在訪問或者已經訪問
        while(!q.empty()){//進行廣搜
            StateNode u=q.front();
            //cout<

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved