問題:人載狼羊草過河,一次擺渡除了人只能載一樣,沒人時,狼與羊、羊與草均不可獨處。問如何過河。
#define STATE char<br />#define PATH char<br />STATE State[8] = { 1 };<br />PATH Path[16];<br />char* Bios[] = { "草", "羊", "狼", "人" };<br />void Ferry ( int state, int dir, int p )<br />{<br /> int i, bio, j;<br /> if ( !dir && ( state & 6 ) != 6 && ( state & 3 ) != 3 )<br /> {<br /> Path[p] = 3;<br /> Ferry ( ~state & 7, 1, p + 1 );<br /> }<br /> for ( i = 0; i < 3; i++ )<br /> {<br /> if ( bio = state & ( 1 << i ) )<br /> {<br /> state &= ~bio;<br /> if ( State[ dir ? ~state & 7 : state ] ||<br /> ( state & 6 ) == 6 || ( state & 3 ) == 3 )<br /> state |= bio;<br /> else if ( dir && !state )<br /> {<br /> Path[p] = i;<br /> printf ( "擺渡過程,共往返 %d 次:/n", p + 1 );<br /> for ( j = 0; j <= p; j++ )<br /> printf ("%s:%s/n", (j & 1 ? "右往左" : "左往右"), Bios[Path[j]]);<br /> printf ( "/n" );<br /> break;<br /> }<br /> else<br /> {<br /> State[ dir ? ~state & 7 : state ] = 1;<br /> Path[p] = i;<br /> Ferry ( ~state & 7, !dir, p + 1 );<br /> State[ dir ? ~state & 7 : state ] = 0;<br /> state |= bio;<br /> }<br /> }<br /> }<br />}
調用方式:
Ferry ( 7, 1, 0 );
參考:
《四人過橋——微軟面試題的電腦類比》
《生日悖論的泛化問題的討論》