日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

状态目标bfs+哈希表 + 三杯水

發布時間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 状态目标bfs+哈希表 + 三杯水 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本篇文章是一篇關于狀態目標的帖子

????給出三個水杯,大小不一,并且只有最大的水杯的水是裝滿的,其余兩個為空杯子。三個水杯之間互相倒水,并且水杯沒有標識,只能根據給出的水杯體積來計算。當初要求你寫出一個程序,使其輸出使初始狀態到達目標狀態的最少次數。
輸入
第一行一個整數N(0<N<50)表現N組測試數據
接下來每組測試數據有兩行,第一行給出三個整數V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表現三個水杯的體積。
第二行給出三個整數E1 E2 E3 (體積小于即是響應水杯體積)表現我們需要的終究狀態
輸出
每行輸出響應測試數據最少的倒水次數。如果達不到目標狀態輸出-1

????

????

????#include<string.h>

????#include<stdlib.h>

????#include<ctype.h>

????#include<stdio.h>

????int visit[100][100][100]; ?//記錄涌現過的狀態

????int dis[1000]; ? ? //記錄每種狀態時候,到了多少次水

????int p[3]; ? ? //三瓶水的容量

????int a[1000][3]; ? //倒水狀態

????int goal[3]; ? ? //目標狀態

????void visited(int tmp[3]);

????int check(int tmp[3]);

????bool pour(int tmp[3],int i,int j)

????{

????if(tmp[i] ==0)

????return false; ? ? ?//瓶子沒有水了

????if(tmp[j] == p[j]) return false; ? ?//另一個瓶子裝滿了水

????if(tmp[i] > (p[j]-tmp[j]))

????{

????tmp[i]-= (p[j]-tmp[j]);

????tmp[j] = p[j];

????}

????else

????{

????tmp[j] +=tmp[i];

????tmp[i] =0;

????}

????if(check(tmp))

????{

????return false;

????}

????else

????{

????visited(tmp);

????return true;

????}

????}

每日一道理
如果你們是藍天,我愿做襯托的白云;如果你們是鮮花,我愿做陪伴的小草;如果你們是大樹,我愿做點綴的綠葉……我真誠地希望我能成為你生活中一個歡樂的音符,為你的每一分鐘帶去祝福。

????int check(int tmp[3]) ? //查看是否涌現過狀態

????{

????if(visit[tmp[0]][tmp[1]][tmp[2]])

????return 1;

????return 0;

????}

????void visited(int tmp[3]) ? //記錄這種狀態涌現過

????{

????visit[tmp[0]][tmp[1]][tmp[2]] = 1;

????}

????int bfs()

????{

????int i,j,k;

????int head=0,tail=1;

????visited(a[head]); ? //記錄初始狀態為涌現過

????while(head <tail)

????{

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

????if(a[head][i]!=goal[i]) break;

????if(i>=3)?

????return dis[head]; ? ?//與目標狀態雷同

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

????for(j=0;j<3;j++)

????{

????for(k=0;k<3;k++) ? ? ?//查看第i層的下一個節點狀態

????a[tail][k] = a[head][k];

????if(j!=i)

????if(pour(a[tail],i,j))

????{

????dis[tail] = dis[head]+1;

????tail++; ? ? //入隊列

????}

????}

????head++; ? //出隊列

????}

????return -1;

????}

????int main()

????{

????int count[100];

????int n;

????scanf("%d",&n);

????int i=-1;

????while(++i<n)

????{

????memset(a,0,sizeof(a));

????memset(dis,0,sizeof(dis));

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

????scanf("%d %d %d",&p[0],&p[1],&p[2]);

????scanf("%d %d %d",&goal[0],&goal[1],&goal[2]);

????a[0][0] = p[0];

????int min=bfs();

????count[i] = min;

????}

????for(i=0;i<n;i++)

????printf("%d\n",count[i]);

????return 1;

????}

文章結束給大家分享下程序員的一些笑話語錄: 面試官:熟悉哪種語言
應聘者:JAVA
面試官:知道什么叫類么
應聘者:我這人實在,工作努力,不知道什么叫累
面試官:知道什么是包?
應聘者:我這人實在 平常不帶包 也不用公司準備了
面試官:知道什么是接口嗎?
應聘者:我這個人工作認真。從來不找借口偷懶
面試官:知道什么是繼承么
應聘者:我是孤兒沒什么可以繼承的
面試官:知道什么叫對象么?
應聘者:知道,不過我工作努力,上進心強,暫時還沒有打算找對象。
面試官:知道多態么?
應聘者:知道,我很保守的。我認為讓心愛的女人為了自已一時的快樂去墮胎是不道德的行為!請問這和C#有什么關系??

轉載于:https://www.cnblogs.com/xinyuyuanm/archive/2013/05/19/3087208.html

總結

以上是生活随笔為你收集整理的状态目标bfs+哈希表 + 三杯水的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。