程式設計也快樂: 兩隻水壺 C程式碼 搜尋版
搜。解釋都在程式碼的註釋裡。程式碼也可以在http://codepad.org/93Rptbfh上看
#include<stdio.h>
#define MAX_QUEUE 100000
#define TARGET 3
#define A_VOLUMN 5
#define B_VOLUMN 6
#define min(a,b) (a) < (b) ? (a) : (b)
struct state {
int bottleA; /* Remained water in bottle A */
int bottleB; /* Remained water in bottle B */
int action; /* How this state is achieved from its father state */
int father; /* Where this state is transfered from */
};
enum Action {
FILL_A, /* Fill A with full water */
FILL_B, /* Fill B with full water */
A_TO_B, /* Pour the water from A to B */
B_TO_A, /* Pour the water from B to A */
POUR_A, /* Pour all the water from A to the pool to make it empty*/
POUR_B, /* Pour all the water from B to the pool to make it empty*/
NONE /* NONE ACTION */
};
struct state queue[MAX_QUEUE]; /* The search Queue*/
int head; /* The head of the search queue */
int tail; /* The tail of the search queue */
int success = 0; /* Whether the search has succeed */
int flag; /* This will record the target position in the queue*/
short checked[A_VOLUMN + 1][B_VOLUMN + 1] = {0};
/**
* Initialize the search queue, insert the first state
*/
void init() {
head = 0;
tail = 1;
queue[0].bottleA = 0;
queue[0].bottleB = 0;
queue[0].father = 0;
queue[0].action = NONE;
checked[0][0] = 1;
}
void update(int a, int b, enum Action action) {
/* If this state is checked, ignore it */
if (checked[a][b])
return;
/* Record the state in the queue and check it */
queue[tail].bottleA = a;
queue[tail].bottleB = b;
queue[tail].action = action;
queue[tail].father = head;
checked[a][b] = 1;
/* If we have arrived at the target, record the tail for backtracing the result */
if (a == TARGET || b == TARGET) {
success = 1;
flag = tail;
}
tail++;
}
void generateStates() {
int transfered_water;
/* Fullfill the bottle A */
update(A_VOLUMN, queue[head].bottleB, FILL_A);
/* Fullfill the bottle B */
update(queue[head].bottleA, B_VOLUMN, FILL_B);
/* Transfer water from A to B */
transfered_water = min(queue[head].bottleA, B_VOLUMN - queue[head].bottleB);
update(queue[head].bottleA - transfered_water, queue[head].bottleB + transfered_water, A_TO_B);
/* Transfer water from B to A */
transfered_water = min(queue[head].bottleB, A_VOLUMN - queue[head].bottleA);
update(queue[head].bottleA + transfered_water, queue[head].bottleB - transfered_water, B_TO_A);
/* Empty Bottle A */
update(0, queue[head].bottleB, POUR_A);
/* Empty Bottle B */
update(queue[head].bottleA, 0, POUR_B);
}
void work() {
while(!success && head != tail) {
generateStates();
head++;
};
}
void backtraceResult(int pointer) {
if (pointer == 0)
return;
else
backtraceResult(queue[pointer].father);
static char* actions[] = {"Fill A with full water from the pool -> ",
"Fill B with full water from the pool -> ",
"Pour the water from A to B -> ",
"Pour the water from B to A -> ",
"Empty bottle A -> ",
"Empty bottle B -> "};
printf("%s A:%3d B:%3d\n", actions[queue[pointer].action], queue[pointer].bottleA, queue[pointer].bottleB);
}
void printResult() {
if (!success) {
printf("Cannot search out the result!\n");
return;
}
/* Print the initial state */
printf("Start with A: 0 B: 0\n");
/* Backtrace to output all states leading to the solution */
backtraceResult(flag);
/* Print a success to indicate we achieved our goal */
printf("Success!\n");
}
int main() {
init();
work();
printResult();
return 0;
}
結果:
Start with A: 0 B: 0
Fill A with full water from the pool -> A: 5 B: 0
Pour the water from A to B -> A: 0 B: 5
Fill A with full water from the pool -> A: 5 B: 5
Pour the water from A to B -> A: 4 B: 6
Empty bottle B -> A: 4 B: 0
Pour the water from A to B -> A: 0 B: 4
Fill A with full water from the pool -> A: 5 B: 4
Pour the water from A to B -> A: 3 B: 6
Success!
相關文章
- 程式設計師快樂器之JAVA程式碼生成工具程式設計師Java
- 程式設計師節快樂程式設計師
- 使用Google Guava快樂程式設計GoGuava程式設計
- 程式設計師的快樂生活程式設計師
- SI 2120程式設計影像搜尋綜合程式設計
- 程式設計師如何祝自己生日快樂程式設計師
- 哈嘍C!蘇小紅-C語言程式設計(第3版)程式碼C語言程式設計
- 直播系統程式碼,常用搜尋中搜尋歷史,搜尋推薦功能
- 讓程式設計快樂起來的過程程式設計
- 搜尋引擎ElasticSearch18_ElasticSearch程式設計操作5Elasticsearch程式設計
- 程式設計師入職三個月,竟一行程式碼都沒提交:我愛程式碼,程式碼使我快樂程式設計師行程
- 程式設計師快樂撩妹秀技術兩不誤(行政財務拆分篇)程式設計師
- Python - 物件導向程式設計 - MRO 方法搜尋順序Python物件程式設計
- 如果搜尋引擎被禁止,你還會程式設計嗎?程式設計
- 程式碼除錯技巧【OI縮水版】除錯
- 五線譜入門,程式設計師也可以玩音樂程式設計師
- 音樂檔案搜尋工具:AudioFinder Mac版Mac
- 微信小程式實現全域性搜尋程式碼高亮微信小程式
- 華為大佬:做一個快樂的程式設計師程式設計師
- 程式設計師 SEO 系列:如何找到更多搜尋關鍵詞?程式設計師
- 水一貼,新年快樂!
- 傳播正能量——做一個快樂的程式設計師程式設計師
- 什麼是程式設計?大道之行也,“程式設計”為公程式設計
- SQLSERVER 居然也能調 C# 程式碼 ?SQLServerC#
- 不再做夢,快樂程式碼到此為止!
- SEO 搜尋引擎最佳化 程式碼層面的
- 【程式碼隨想錄】廣度優先搜尋
- layui 下拉框搜尋及程式碼實現UI
- 我招了個“水貨”程式設計師程式設計師
- C程式設計題C程式程式設計
- c#程式設計C#程式設計
- 風變程式設計——小白也能學會的程式設計課!程式設計
- 無程式碼程式設計程式設計
- 《程式設計珠璣》程式碼之路14:兩個不會演算法也能把效率提升4倍的小套路程式設計演算法
- 中文程式設計之後,再來表格程式設計,這無程式碼超車的速度有點快程式設計
- Windows 程式設計簡介從C/C++到Windows程式設計Windows程式設計C++
- 程式猿1024節快樂
- 買這家公司的遊戲,還不如買兩瓶快樂水?遊戲
- 公佈上一次搜尋引擎的程式碼