有3只母雞分別帶著3只小雞要過河,河邊只有一條船,其中母雞都會划船,小雞中只有一隻會划船,小雞離開媽媽與其他母雞在一起時小雞會被其他母雞啄死。示例:将母鸡标记为A,B,C,它们的孩子标记为a(会划船),b,cABCc ab->
ABCc <-a b...
ABCc <-a b...
解决方案 »
- list的实际大小和list.size()得到的值不一样,求大侠帮忙,很急!!!
- 发个java socket做的自适应ftp server 和 client,
- 线程池的问题。如何监控线程池中线程,比如查看正在等待中的任务个数 ....................................
- lucene的问题,高手进
- 请问一下各位关于ServerSocket和jsp页面的问题,急~~~
- JBuilderX的问题
- 请问public static <T> void sort(T[] a, Comparator<? super T> c) 中 <T> 和<? super T> 什么意思?先谢了!
- 求教
- 启动Tomcat时报错,急需解决
- 有个类,没看明白,问问大家为什么这么写
- 求编一个小球代码
- java 序列化问题
设大老虎为ABC,相应的小老虎为abc,其中c会划船。
1、ac过河,c回来 (a小老虎已过河)
2、bc过河,c回来 (ab小老虎已过河)
3、BA过河,Bb回来 (Aa母子已过河)
4、Cc过河,Aa回来 (Cc母子已过河)
5、AB过河,c回来 (ABC三个大老虎已过河)
6、ca过河,c回来 (ABCa已过河)
7、cb过河,大功告成!
就OK了
特别是只有6只鸡的情况下O(N)和O(N^2)的速度,没什么本质区别啊
ABCc ab->
ABCc <-a b
ABC ac-> b
ABC <-a bc
Aa BC-> bc
Aa <-Bb Cc
Bb Aa-> Cc
Bb <-Cc Aa
bc BC-> Aa
bc <-a ABC
c ab-> ABC
c <-a ABCb
ac-> ABCb
ABCabc
int[] left; int[] boat; int[] right; boolean fromLeft;
/** 返回某个int代表的名字
* 母鸡比小鸡小32,正好
*/
private static char getName(int x) {
return (char) ('A' + x - 1);
} /**
* 数组可以是左岸、右岸或者船。
*/
private static boolean check(int[] array) {
int parent = 0;
int child = 0;
for (int x : array) {
if ((parent & 0x20) == 0) {
parent |= x;
} else {
child |= x;
}
}
child &= 0x1F;
if (parent == 0 || child == 0) {
// 只有母鸡或小鸡,不用比较
return true;
}
if ((parent ^ child) == 0) {
// 所谓异或,某位上数字相异为1,即非零的情况下,至少有一对母子分离
return false;
}
return true;
}
不知道lz平时的问题是否来自Project Euler?
虽然没在上面做过题,不过看别人挑出的一些问题,跟LZ出的题目感觉比较像,偏重于思考,而不是建模。
代码:#include <stdio.h>
typedef struct state s;int isSafe(s);struct state
{
int people;
int ghost;
};s st = {3, 3};
s temp;
int scheme[6][2] = { {-2, 0}, {0, -2}, {-1, -1}, {0, 1}, {1, 0}, {1, 1}};int main()
{
temp.ghost = 3;
temp.people = 3;
int flag = 0, i; printf("Start: People: 3\t Ghost: 3\n");
while( st.people != 0 || st.ghost != 0 )
{
//东岸往西岸运送
if(flag%2 == 0)
{
for(i = 0; i < 3; i++)
{
temp.people += scheme[i][0];
temp.ghost += scheme[i][1];
if( isSafe(temp) == 1 )
{
st.people = temp.people;
st.ghost = temp.ghost;
break;
}
else
{
temp.people -= scheme[i][0];
temp.ghost -= scheme[i][1];
}
}
}
//西岸往东岸运送
else
{
for(i = 3; i < 6; i++)
{
temp.people += scheme[i][0];
temp.ghost += scheme[i][1];
if( isSafe(temp) == 1 )
{
st.people = temp.people;
st.ghost = temp.ghost;
break;
}
else
{
temp.people -= scheme[i][0];
temp.ghost -= scheme[i][1];
}
}
}
flag++;
printf("People: %d\t Ghost: %d\n", st.people, st.ghost);
} return 0;
}int isSafe(s s)
{
//三人或者零人,安全
if(s.people == 3 || s.people == 0)
return 1;
else if( s.people == 1 && s.ghost == 1)
return 1;
else if( s.people == 2 && s.ghost == 2 )
return 1;
return 0;
}
ac->
<-a ab->
<-a BC->
<-Bb Aa->
<-Cc BC->
<-a ab->
<-a ac->
搞定
AC过河
最后ac过河 不就可以了吗?完全符合楼主条件。
1.ABCc ab->
2.ABCc <-a b
3.ABC ac-> b
4.ABC <-a bc
5.Aa BC-> bc
6.Aa <-Bb Cc
7.ab ->AB Cc
8. ->ab ABCc
这样没问题吧.
将母鸡标记为A,B,C,它们的孩子标记为a(会划船),b,c;
1.ABCc ab->
2.ABCc <-a b
3.ABC ac-> b
4.ABC <-a bc
5.Aa BC-> bc
6.Aa <-Bb Cc
7.Bb ->Aa Cc
8.Bb <-Cc Aa
9.bc BC-> Aa
10.bc <-a ABC
11.c ->ab ABC
12.c <-a ABbC
13 ac-> ABbC
BbCc Aa->
BbCc <-a A
abc BC-> A
abc <-C AB
Cc ab-> AB
Cc <-a ABb
a Cc-> ABbCc
a <-A BbCc
Aa-> AaBbCc
BbCc Aa->
BbCc <-a A
abc BC-> A
abc <-C AB
ab Cc-> AB
ab <-B ACc
a Bb-> ACc
a <-A BbCc
Aa-> AaBbCc
这个非最优解,可以再剩下两步,思路如下:
1. ABCabc2. AaCc Bb->
3. AaCc <--B b4. ABC ac-> b
5. ABC <--a bc6. Aa BC-> bc
7. Aa <--Cc Bb8. ac AC-> Bb
9. ac <--C ABb10. a Cc-> ABb
11. a <--A BCbc12. Aa-> BCbc13. ABCabc
又想了一下,发现还能省下两步......我错了
ABCa能开船...
1. ABCabc
2. BCbc Aa->
3. BCbc <--a A
4. abc BC-> A
5. abc <--C AB
6. ab Cc-> AB
7. ab <--B ACc
8. a Bb-> ACc
9. a <--A BCbc
10. Aa-> BCbc
11. ABCabc