c++ 宽搜(倒水)
題目描述
有一個(gè)很大的水缸和二個(gè)容量分別為X和Y的水壺,按照以下的規(guī)則倒水,問(wèn)最少經(jīng)幾次倒水后,可得到Z升水
規(guī)則1:水缸向水壺1倒水,將水壺1裝滿;
規(guī)則2:水缸向水壺2倒水,將水壺2裝滿;
規(guī)則3:水壺1向水缸倒水,直到水壺1空;
規(guī)則4:水壺2向水缸倒水,直到水壺2空;
規(guī)則5:水壺1向水壺2倒水,直到水壺1空了或者水壺2滿了;
規(guī)則6:水壺2向水壺1倒水,直到水壺2空了或者水壺1滿了;
輸入
只有一行數(shù)據(jù),包括以空格分隔的三個(gè)數(shù)字,分別表示水壺1( <= 100)、 水壺2的水量( <= 100 )以及期望得到的水量( <=100 )。
輸出
若經(jīng)若干次倒水能得到所要求的水量,則輸出最少的倒水次數(shù);若無(wú)論如何倒水都無(wú)法得到規(guī)定的水量,則輸出No Solution!
樣例輸入
4 3 1樣例輸出
2AC代碼
#include <iostream> #include <string.h> using namespace std; struct point //結(jié)構(gòu)體 {int x, y, step; }; bool used[101][101]; point q[20000], s; int xx, yy, t; int f = 1, e = 1; point gen(point u, int cc)//嘗試枚舉每一個(gè)規(guī)則 {point v = u;v.step = u.step + 1;//開(kāi)始枚舉規(guī)則if (cc == 1) v.x = xx;//水缸向水壺1倒水,將水壺1裝滿else if (cc == 2) v.y = yy;//水缸向水壺2倒水,將水壺2裝滿else if (cc == 3) v.x = 0;//水壺1向水缸倒水,直到水壺1空else if (cc == 4) v.y = 0;//水壺2向水缸倒水,直到水壺2空else if (cc == 5)//水壺1向水壺2倒水,直到水壺1空了或者水壺2滿了{(lán)if (u.x + u.y <= yy) v.x = 0, v.y = u.x + u.y;//如果y能把x和y的水量都裝下else v.y = yy, v.x = u.x + u.y - yy;//y裝不下從x倒過(guò)來(lái)的水}else//水壺2向水壺1倒水,直到水壺2空了或者水壺1滿了{(lán)if (u.x + u.y <= xx) v.y = 0, v.x = u.x + u.y;//如果x能把x和y的水量都裝下else v.x = xx, v.y = u.x + u.y - xx;//x裝不下從y倒過(guò)來(lái)的水}return v; } int main() {scanf ("%d %d %d", &xx, &yy, &t);//xx是x桶的水量,yy是y桶的水量if (t == 0){printf ("0\n");return 0;}memset (used, 0, sizeof (used));//memsets.x = 0, s.y = 0, s.step = 0;q[1] = s; ///開(kāi)始寬搜///while (f <= e)//f是出隊(duì)下標(biāo) e是入隊(duì)下標(biāo){point u = q[f++];//選定的元素for (int i = 1; i <= 6; i++)//嘗試枚舉6個(gè)規(guī)則{point v = gen(u, i);//v就是將要入隊(duì)的元素if (used[v.x][v.y] == 0){if (v.x == t || v.y == t)//任意一個(gè)杯子里面有目標(biāo)水量{printf ("%d\n", v.step);//就打印步數(shù)return 0;//默默退出}q[++e] = v;//入隊(duì)used[v.x][v.y] = 1;//表示已經(jīng)被選擇過(guò)}}}printf ("No Solution!\n");//如果無(wú)法完成return 0; }思路分析
step1:將初始狀態(tài)入隊(duì)
step2:以初始狀態(tài)為中心按6個(gè)規(guī)則向6個(gè)方向?qū)ふ铱赡艿闹等腙?duì)
step3:在通過(guò)可能的值向6個(gè)方向繼續(xù)拓展,直到找到目標(biāo)(水壺1 或 水壺2 中的水 等于目標(biāo)水量)
轉(zhuǎn)載于:https://www.cnblogs.com/LJA001162/p/11218432.html
總結(jié)
以上是生活随笔為你收集整理的c++ 宽搜(倒水)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 本人98年户籍由湖南当地农村转入学校,0
- 下一篇: 个人出路......