#include #include #include using namespace std;
struct point
q[250000];
bool status[104][104][104]; //代表標記該狀態是否被訪問過的陣列
int count = 0; //定義最少倒的次數
int s, n, m; //代表可樂的體積,兩個杯子的容量
int flag = 0;
struct point bfs(); //代表進行bfs的函式
void dfs(struct point end_point); //代表進行遞迴的函式(這裡用dfs表示)
void init(); //代表進行初始化的函式
void init()
} }}struct point bfs()
for (i = 0; i < 6; i++)
}else if (i == 1) //代表將s容器的水倒入m容器
}else if (i == 2) //代表將n容器的水倒入s容器
}else if (i == 3) //代表將n容器的水倒入m容器
}else if (i == 4) //代表將m容器的水倒入s容器
}else if (i == 5) //代表將m容器的水倒入n容器
}if (status[moves][moven][movem] == false) //如果該狀態還沒有訪問過
}if ((q[now].swater == mid && q[now].nwater == mid) || (q[now].swater == mid && q[now].mwater == mid) || (q[now].nwater == mid && q[now].mwater == mid))
now++;
} struct point bad;
bad.pre = -10000;
return bad;
}void dfs(struct point end_point)
if (end_point.pre != -1)
if (end_point.pre == -1)
dfs(q[end_point.pre]); //代表從當前狀態遞迴到該狀態之前的狀態
}int main()
else
}else
}count = 0;
flag = 0;
}}
hdu 1495 非常可樂
題意 給你三個容器讓你平分可樂,求最少的步數。思路 一看到求最少步數,就想到了廣搜,但是沒有思路,但看別人分情況,瞬間就明白啦。可以s n,s m,n s,n m,m s,m n這六種情況討論就行,每種又有倒完和倒不完兩種情況,直到出現兩個容器都有s 2,這就是最少步數。但s是奇數時是不能平分的,三...
hdu 1495 非常可樂
hdu 1495 非常可樂 題目大意 給你三個容器,他們的容量分別是 s,n,m 且s n m,給你s,n,m。s代表裝在容器裡可樂,n和m代表的是兩個杯子的容量,求他們能否平分這杯可樂。如果能就輸出倒的最小次數,如果不能就輸出 no。題目分析 也就是要達到能 s 2,0,s 2或 0 s 2,s ...
hdu 1495 非常可樂
兩個杯子按大小排序,為s m n,1.只要n滿了,就把n裡的東西放到s中 2.只要m非空,就把m中的放到n中 3.如果m為空,把s中的放到m中 超時 include int n,m,s int main if ss aa bb 0 得到均分 if bb b 若小杯子裡裝滿可樂,將小杯子裡的可樂倒入可...