牛客 倒水問題

2022-06-01 01:57:13 字數 2948 閱讀 1490

待學習。。

//

study.cpp: 定義控制台應用程式的入口點。

//#include "

stdafx.h

"#include

#include

#include

#include

#include

using

namespace

std;

/*將4杯子倒水問題改為乙個足夠大的杯子倒向4個杯子

*/bitset

<17043521> hash;/*

(大小為64*64^4+64*64^3+64*64^2+64*64^1+64*64^0)記錄每次操作後的abcd杯子的當前容量是否已經存在過

*/const

int max_step = 100000

;int wq[max_step][6];/*

記錄每步操作後0和abcd的當前容量,最後乙個記錄操作次數

*/int goal[5];/*

0和abcd杯子最終狀態

*/int cap[5]; /*

0和abcd杯子的最大容量

*/int

goalval;

int head = 0

;int tail = 0

;void movw(int numfrom, int numto, int other1, int other2, int other3)/*

numfrom倒入numto

*/

else

int hashval = wq[tail][1] * 262144 + wq[tail][2] * 4096 + wq[tail][3] * 64 + wq[tail][4];/*

把abcd杯子需要的狀態抽象為乙個值

*/if (hashval == goalval) throw wq[head][5] + 1;/*

判斷是否為最終狀態

*/if (!hash[hashval])/*

該次操作之後的狀態之前未存在過並記錄*/}

intmain()

cap[

0] = 6400;/*

0杯子為足夠大的杯子,0杯子的容量

*/wq[tail][

0] = 6400;/*

0杯子的當前容量

*//*

初始化abcd杯子當前值為0

*/wq[tail][

1] = 0

; wq[tail][

2] = 0

; wq[tail][

3] = 0

; wq[tail][

4] = 0

; wq[tail][

5] = 0

; ++tail;

try

if (wq[head][1

])

if (wq[head][2

])

if (wq[head][3

])

if (wq[head][4

])

if (++head ==max_step)

}printf("-1

");}

catch (int

step)

}

看了上面**,自己給思路改進了一下,**如下:

類似於圖的廣度優先遍歷,每一種情況都乙個個入佇列,然後判斷是否和預期的狀態相等,相等時候停止迴圈,輸出並返回。

// study.cpp: 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include #include #include #include #include #include #include using namespace std;

//儲存每一種狀態

bool m[64][64][64][64];

//int step=0;

const int maxstep = 10000;

vectorcap(4), goal(4);

class state

int a, b, c, d;

int step;

};queuequeue();

//對序號k進行操作,裝滿,或者匯入其他容器

void water_solution(int t[5],int k)

); m[t[0]][t[1]][t[2]][t[3]] = 1;

} t[k] = tmp;

} //有剩餘的水,可倒給其他杯子

if (t[k] != 0)

); m[t[0]][t[1]][t[2]][t[3]] = 1;

}t[k] = tmp;

continue;

}//倒給別人,1:倒不完

if (t[k] + t[i] >= cap[i])

);m[t[0]][t[1]][t[2]][t[3]] = 1;

}t[k] = tmp;

t[i] = tmp2;

}else

);m[t[0]][t[1]][t[2]][t[3]] = 1;

}t[k] = tmp;

t[i] = tmp2;

}} }

}int main()

; int k = 0;

while (!queue.empty())

for(int i=0;i<4;i++)

water_solution(t, i);

} cout << -1;

system("pause");

return 0;

}

貪心演算法 牛客倒水

時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 題目描述 有乙個大水缸,裡面水的溫度為t單位,體積為c公升。另有n杯水 假設每個杯子的容量是無限的 每杯水的溫度為t i 單位,體積為c i 公升。現在要把大水缸的水倒...

牛客網 洗牌問題

問題描述 洗牌在生活中十分常見,現在需要寫乙個程式模擬洗牌的過程。現在需要洗2n張牌,從上到下依次是第1張,第2張,第3張一直到第2n張。首先,我們把這2n張牌分成兩堆,左手拿著第1張到第n張 上半堆 右手拿 著第n 1張到第2n張 下半堆 接著就開始洗牌的過程,先放下右手的最後一張牌,再放下左手的...

CODEVS 倒水問題

題目描述 有兩個無刻度標誌的水壺,分別可裝 x 公升和 y 公升 x,y 為整數且均不大於 100 的水。設另有一水 缸,可用來向水壺灌水或接從水壺中倒出的水,兩水壺間,水也可以相互傾倒。已知 x 公升壺為空 壺,y 公升壺為空壺。問如何通過倒水或灌水操作,用最少步數能在x或y公升的壺中量出 z z...