根據以下設定,山羊們能否穿過狹窄的隧道?

有一條很窄的隧道,每次只能容納 1 只羊通過,然後現在有 10 只羊,5 只(1)從隧道的 A 端去 B 端,另外 5 只(2)從 B 端去 A 端。

像這樣:B 22222 11111 A , 5 只羊的中間有一個空格。

規則

  1. 兩邊的羊都只能往前跳;
  2. 羊能跳到另一隻羊的身上;
  3. 不能從一隻羊身上跳到另一隻羊身上;
  4. (補充)當羊上有羊時,下面的羊無法移動。
  5. (補充)一隻羊身上最多只能有1隻羊。

問題:求這些羊能不能過到對面?

如果能請說明方法,如不能請證明。


謝謝 @張米奇 在私信中的邀請。
這真是一道有意思的題,規則簡單卻趣味橫生,讓人慾罷不能。

讓我們先來看一下規則:

羊能跳到另一隻羊的身上,但是兩邊的羊都只能往前跳(不能後退),且不能從一隻羊身上跳到另一隻羊身上。


一開始,10 只羊的位置是:22222011111 (這裡用 「0」 代表空格)
我們的目標是,5 個標號為「1」 的羊到左邊,5 個標號為 「2」 的羊到右邊。

要完成這個目標,核心操作是什麼?
顯然,是 「2」 和 「1」 的左右互換!
因為標號為 1 和 2 的羊各有 5 只,所以一共要完成 25 次這樣的互換。

為了找到可能的方案,先來證明幾個引理:

引理1:「2」 和 「1」 能達成互換的充要條件是: 「2」、「1」、「0」 三者相鄰,即存在相鄰三個位置為:201,210,021

這是因為,「不能從一隻羊身上跳到另一隻羊身上」,所以當一隻羊跳到另一隻羊身上時,在前方必須要留一個空位。

引理2: 任何時候,若存在四個相鄰的羊構成 「2211」,則遊戲無法繼續。

這是因為,「2」 只能往右,「1」 只能往左。「2211」 出現後,之間沒有空格,這四個位置被鎖死,無法使 「1」 到 「2」 的左邊了。


(進一步地,若「22」在「11」左邊,且22和11中沒有0,且遊戲也無法繼續)



有了兩個引理,我們開始尋找方案。

  • 根據引理1,所有可以達成「羊位置互換」的方案是:
  1. 210 =&> 012 (2 跳到 1 上面,然後再往前跳)
  2. 021 =&> 120 (1 跳到 2 上面,然後再往前跳)
  3. 201 =&> 210 =&> 012
  4. 201 =&> 021 =&> 120
  • 根據引理2,我們一旦遇到兩個標號相同的羊相鄰,務必要注意在邊上留下空格,以防「鎖死」情況的出現。進而推得,或許儘可能讓「1」和「2」相間(1212……),會比較好一些。


開始尋找方案了!

一開始,是這樣的:

我們注意到,有一組 201。第一步,可以讓 1 前進,也可以讓 2 前進。

不妨讓先 1 前進,然後讓 2 翻過去, 201 =&> 012

現在,又看到一個 201,但注意到它們的右邊有一個211,所以 201 =&>012 是不可行的(否則形成 2211),於是只有 201 =&>120

現在,由於「0」左邊那個」2「不能往前走了(否則形成「2211」),可以跳躍的只有 021=&>120。

又出現 201 了,到底讓它變成 120 還是 012 呢?

如果變成 120, 則0左邊變為 2221211。雖然不是直接的 2211,而是 22(12)11,顯而易見,這個也是「鎖死」的。(實際上,當「22」 在 「11」左邊時,中間必須要有「0」,否則會「鎖死」)

所以只能變成 012 了:

依然要防止「鎖死」,接下來 2 步是必然的:

又遇到 201 了,該變成 120 還是 012 呢?

注意到右邊最後兩個數是11,所以如果變成 012, 右邊就是 22121211,鎖死。

所以只能是變成 120。

接下來的幾步也是必然:

到第 10 步,我們終於完成了 2 和 1 相間的壯舉!來來來,排到一起去:

你看,這個 褐色的 2 終於可以解放了!


當 2 和 1 相間時,我們可以讓一批羊不動,讓另一批一個個翻出隧道:

其中,褐色的 2 代表準備【連跳】的羊。

比如第15 步後,我們要做的是:

你看,是不是真的有點像跳山羊呢?


最後,到了第 16 步結束的時候,剩下 5個 1 :

它們只要慢悠悠地穿過隧道就好啦!

最終,我們找到了讓山羊們穿過隧道的方案。


咱們回顧一下吧:

你看,當第一隻編號為「1」的羊邁出第一步,一直到第 10 步,羊兒們都別無選擇。


這就是「華山天險一條路」呀!


更有趣的是 「0」 的位置,我們來看:

你看,左右搖擺,越擺越大~

如果左右的羊不是各 5 只 而是更多隻,我們可以看到,0 的搖擺會更大更多,像這樣:

這,大概就是做完一道題後,還欲罷不能吧~


(註:在達成 2121……21 之前,折線的段數等於一邊羊的只數)


【還沒完】

******************

拓展:

評論區中 @噴者孫氏給題目加強了條件,即 過程中羊不能跳出隧道,最終要達成 11111022222
如此看來,題目好像變難了一點,第 10 步以後需要修改。

但實際上,只要多想一下下就可以了,也並沒有很難:

只要大家規矩一點,不要一次性翻出,每次都讓後面的羊 依次翻 1 下 就可以啦!

如下圖:

5個標號為「2」的羊,可以依次翻一下,也可以同時翻。


11+、12+、13+、14+ 同理。


看完上面那個表,比較前10步和後5步,

我們發現,前10步中,有些步驟是可以合併的,這樣就把答案簡化成更漂亮的形式。


如下圖所示:

圖中,

  • 綠色的數字代表下一步僅平移該數字1下;
  • 紅色的「2」 代表下一步所有的紅色「2」同時翻過「1」;
  • 藍色的「1」 代表下一步所有的藍色「1」同時翻過「2」;

你會發現,以 第 5 步為中心,之前的 4 步和之後的 4 步是【完全對稱】的。


總計翻的次數也成對稱狀: 1+2+3+4+5+4+3+2+1=25


再來看 0 的位置:

越擺越大,越擺越小……


是不是有點像宇宙的大爆炸和大擠壓呢?

【完】


********************

【如需轉載,請務必註明作者和出處,如有商業用途,請聯繫我】


可以啊,
1
九〇日 輕鬆交換
2.A
九九〇日日
九〇旯〇日 日九來相會,日上九下
九日九日〇 兩日向左走
〇旮〇旮〇 兩九爬上來
〇日九日九 兩九滾下去
日〇旯〇九 兩日再左走
日日〇九九 日九滾兩邊,日左九右

2.B 對稱的一種解法
九九〇日日
九〇旮〇日 日九來相會,日下九上
〇九日九日 兩九向右走
〇旯〇旯〇 兩日爬上來
日九日九〇 兩日滾下去
日〇旮〇九 兩九再右走
日日〇九九 日九滾兩邊,日左九右

總結:找到日九相間,〇在兩端的形式很關鍵,任何一種都能推出最終的結果
『九日九日〇 』
『〇日九日九 』
『〇九日九日 』
『日九日九〇 』
不妨起個名字叫 X集合
3×× 如果可以得到這樣的形式
看3個的情形,
阿三:『九九九〇日日日』 九九〇日日 等價於 X集合的任意一個,當然包括『日九日九〇 』(X集合第四個元素),那麼改寫成 阿三: 『九日九日九〇日』,左移個日,成為
『九日九日九日〇』,這個簡單變化就能得到『日日日〇九九九』了。
即 由2成立,得到了3成立;差不多由3可推4,這就是傳說中的數學歸納法。


機械迷城裡的一關,感覺跟題主的意思有點像,黑色的只能向上,白色的只能向下,中間有空格,但是只有3隻,所以簡單一點,思路應該差不多


背上有山羊的羊如果是可以移動的話,那別說中間有個空格了,就是沒空格,一共就10個位置,這些羊也能完美互換。


@曾加 給出的方案是正確的。此處給出一個通用情形的解答。

[構造性證明]畫一個圖來表示狀態遷移的過程:

假設上面矩陣中左上角為(0, 0),右下角為(5, 5)。

  • 水平向右箭頭表示20
ightarrow 02
  • 垂直向下箭頭表示01
ightarrow 10
  • 左下向右上箭頭表示210
ightarrow 012
  • 右上向左下箭頭表示021
ightarrow 120
  • 坐標(i, j)所對應的序列狀態為
    • i+j為奇數:序列中(從右向左)第(i+1)個2越過了(從左向右)第j個1
    • i+j為偶數:序列中(從右向左)第i個2越過了(從左向右)第(j+1)個1

圖中剪頭所指示的路徑即為22222011111
ightarrow 11111022222的變換方案。

[擴展情形]當序列中1和2的個數不等時,上面的方法一樣可行。比如,考慮222220111
ightarrow 111022222
的情形,可以使用如下矩陣

[複雜度分析]一般而言,從具有m個2和n個1的初始局面2...201...1中變至最終狀態1...102...2,就是對矩陣從左上角(0,0)點至右下角(m,n)點的遍歷,總步數為(m+1)(n+1)-1=mn+m+n

因此當m=n=5時,共需35步。變例中m=5,n=3,共需23步。


羊能跳到另一隻羊的身上 沒有說跳的距離限制!

所以讓羊1使勁跳!跳到最左邊的羊2身上!

------------------------------------------------------
暴跳羊1
B 羊22222 1111 A
------------------------------------------------------

然後再讓羊1溜達的走下來。。

------------------------------
羊1 B 羊22222 1111 A
------------------------------


同理重複四遍

---------------------------
11111 B 22222 A
---------------------------

然後羊2集體溜達走過隧道

---------------------
11111 B A 22222
---------------------

Done?
你以為是數學題,其實是測智商的腦筋急轉彎哦

---------------------------------------------------

你們考慮過羊二的感受嗎?!!魂淡


想直接寫代碼的點我...


然而今天太晚啦,有興趣者可以考慮怎樣寫的簡潔優美..


這個可以用數學歸納法證明

1.對於k組羊,只要能走成a羊和b羊相間的排列(ba…ba0)就能夠通過隧道
(證明:走成(ba…ba0)後只要所有b羊往前走,然後所有a羊往前走,然後所有b羊往前走……輪流數次之後就能變成(b…b0a…a)通過隧道了)
2.如果羊群能走成(ab…ab0)的排列,則羊群也能走成(ba……ba0)的排列
(證明:因為羊群是對稱的,所以(aba…ab0)與(0ab…bab)等價,然後(0ab…bab)排列的羊群只要所有b羊往前一步則變成(bab…ba0)的排列)
3.對於k+1組羊,根據1可知羊群能走成(aba…ba0b),最後的b羊往前走一步,羊群就變成了(aba…bab0),則由2可知k+1組羊可以走成(bab…aba0),又由1可知k+1組羊能通過。
即只要k組羊能通過隧道則k+1組羊就能通過隧道。
4.1組羊顯然能夠通過隧道
因此任意組羊都能通過隧道


1.題中似乎沒有說到「山羊不能跳上一隻已經在另一隻羊背上的羊」。
2.隧道並不會移動且只能容納一隻羊,但隧道兩邊的空間似乎沒有極限。

那麼設羊的序號為12345□67890(中間是隧道)
所以是否可以把所有的羊都疊到5號的上面然後讓它們慢慢跳完全程呢


PS:如果用代碼來表達會不會更加有意思呢?

具體步驟看圖吧,畫圖累死我了~感覺這種方案有點兒慢,坐等更高效的方案。


題目不夠嚴謹 ,沒有說明兩邊的羊是不是要同時通過隧道。這樣的話直接等一邊的過了另一邊再過啊。


兩邊各四隻在外面等著,各派一隻進去不就行了。。


The 1 solve:
Step 001:is Move; 05:[0]&<-[1]:06; 2 2 2 2 2 1 0 1 1 1 1
Step 002:is Jump; 04:[2]-&>[0]:06; 2 2 2 2 0 1 2 1 1 1 1
Step 003:is Move; 03:[2]-&>[0]:04; 2 2 2 0 2 1 2 1 1 1 1
Step 004:is Jump; 03:[0]&<-[1]:05; 2 2 2 1 2 0 2 1 1 1 1
Step 005:is Jump; 05:[0]&<-[1]:07; 2 2 2 1 2 1 2 0 1 1 1
Step 006:is Move; 07:[0]&<-[1]:08; 2 2 2 1 2 1 2 1 0 1 1
Step 007:is Jump; 06:[2]-&>[0]:08; 2 2 2 1 2 1 0 1 2 1 1
Step 008:is Jump; 04:[2]-&>[0]:06; 2 2 2 1 0 1 2 1 2 1 1
Step 009:is Jump; 02:[2]-&>[0]:04; 2 2 0 1 2 1 2 1 2 1 1
Step 010:is Move; 01:[2]-&>[0]:02; 2 0 2 1 2 1 2 1 2 1 1
Step 011:is Jump; 01:[0]&<-[1]:03; 2 1 2 0 2 1 2 1 2 1 1
Step 012:is Jump; 03:[0]&<-[1]:05; 2 1 2 1 2 0 2 1 2 1 1
Step 013:is Jump; 05:[0]&<-[1]:07; 2 1 2 1 2 1 2 0 2 1 1
Step 014:is Jump; 07:[0]&<-[1]:09; 2 1 2 1 2 1 2 1 2 0 1
Step 015:is Move; 09:[0]&<-[1]:10; 2 1 2 1 2 1 2 1 2 1 0
Step 016:is Jump; 08:[2]-&>[0]:10; 2 1 2 1 2 1 2 1 0 1 2
Step 017:is Jump; 06:[2]-&>[0]:08; 2 1 2 1 2 1 0 1 2 1 2
Step 018:is Jump; 04:[2]-&>[0]:06; 2 1 2 1 0 1 2 1 2 1 2
Step 019:is Jump; 02:[2]-&>[0]:04; 2 1 0 1 2 1 2 1 2 1 2
Step 020:is Jump; 00:[2]-&>[0]:02; 0 1 2 1 2 1 2 1 2 1 2
Step 021:is Move; 00:[0]&<-[1]:01; 1 0 2 1 2 1 2 1 2 1 2
Step 022:is Jump; 01:[0]&<-[1]:03; 1 1 2 0 2 1 2 1 2 1 2
Step 023:is Jump; 03:[0]&<-[1]:05; 1 1 2 1 2 0 2 1 2 1 2
Step 024:is Jump; 05:[0]&<-[1]:07; 1 1 2 1 2 1 2 0 2 1 2
Step 025:is Jump; 07:[0]&<-[1]:09; 1 1 2 1 2 1 2 1 2 0 2
Step 026:is Move; 08:[2]-&>[0]:09; 1 1 2 1 2 1 2 1 0 2 2
Step 027:is Jump; 06:[2]-&>[0]:08; 1 1 2 1 2 1 0 1 2 2 2
Step 028:is Jump; 04:[2]-&>[0]:06; 1 1 2 1 0 1 2 1 2 2 2
Step 029:is Jump; 02:[2]-&>[0]:04; 1 1 0 1 2 1 2 1 2 2 2
Step 030:is Move; 02:[0]&<-[1]:03; 1 1 1 0 2 1 2 1 2 2 2
Step 031:is Jump; 03:[0]&<-[1]:05; 1 1 1 1 2 0 2 1 2 2 2
Step 032:is Jump; 05:[0]&<-[1]:07; 1 1 1 1 2 1 2 0 2 2 2
Step 033:is Move; 06:[2]-&>[0]:07; 1 1 1 1 2 1 0 2 2 2 2
Step 034:is Jump; 04:[2]-&>[0]:06; 1 1 1 1 0 1 2 2 2 2 2
Step 035:is Move; 04:[0]&<-[1]:05; 1 1 1 1 1 0 2 2 2 2 2
The 2 solve:
Step 001:is Move; 04:[2]-&>[0]:05; 2 2 2 2 0 2 1 1 1 1 1
Step 002:is Jump; 04:[0]&<-[1]:06; 2 2 2 2 1 2 0 1 1 1 1
Step 003:is Move; 06:[0]&<-[1]:07; 2 2 2 2 1 2 1 0 1 1 1
Step 004:is Jump; 05:[2]-&>[0]:07; 2 2 2 2 1 0 1 2 1 1 1
Step 005:is Jump; 03:[2]-&>[0]:05; 2 2 2 0 1 2 1 2 1 1 1
Step 006:is Move; 02:[2]-&>[0]:03; 2 2 0 2 1 2 1 2 1 1 1
Step 007:is Jump; 02:[0]&<-[1]:04; 2 2 1 2 0 2 1 2 1 1 1
Step 008:is Jump; 04:[0]&<-[1]:06; 2 2 1 2 1 2 0 2 1 1 1
Step 009:is Jump; 06:[0]&<-[1]:08; 2 2 1 2 1 2 1 2 0 1 1
Step 010:is Move; 08:[0]&<-[1]:09; 2 2 1 2 1 2 1 2 1 0 1
Step 011:is Jump; 07:[2]-&>[0]:09; 2 2 1 2 1 2 1 0 1 2 1
Step 012:is Jump; 05:[2]-&>[0]:07; 2 2 1 2 1 0 1 2 1 2 1
Step 013:is Jump; 03:[2]-&>[0]:05; 2 2 1 0 1 2 1 2 1 2 1
Step 014:is Jump; 01:[2]-&>[0]:03; 2 0 1 2 1 2 1 2 1 2 1
Step 015:is Move; 00:[2]-&>[0]:01; 0 2 1 2 1 2 1 2 1 2 1
Step 016:is Jump; 00:[0]&<-[1]:02; 1 2 0 2 1 2 1 2 1 2 1
Step 017:is Jump; 02:[0]&<-[1]:04; 1 2 1 2 0 2 1 2 1 2 1
Step 018:is Jump; 04:[0]&<-[1]:06; 1 2 1 2 1 2 0 2 1 2 1
Step 019:is Jump; 06:[0]&<-[1]:08; 1 2 1 2 1 2 1 2 0 2 1
Step 020:is Jump; 08:[0]&<-[1]:10; 1 2 1 2 1 2 1 2 1 2 0
Step 021:is Move; 09:[2]-&>[0]:10; 1 2 1 2 1 2 1 2 1 0 2
Step 022:is Jump; 07:[2]-&>[0]:09; 1 2 1 2 1 2 1 0 1 2 2
Step 023:is Jump; 05:[2]-&>[0]:07; 1 2 1 2 1 0 1 2 1 2 2
Step 024:is Jump; 03:[2]-&>[0]:05; 1 2 1 0 1 2 1 2 1 2 2
Step 025:is Jump; 01:[2]-&>[0]:03; 1 0 1 2 1 2 1 2 1 2 2
Step 026:is Move; 01:[0]&<-[1]:02; 1 1 0 2 1 2 1 2 1 2 2
Step 027:is Jump; 02:[0]&<-[1]:04; 1 1 1 2 0 2 1 2 1 2 2
Step 028:is Jump; 04:[0]&<-[1]:06; 1 1 1 2 1 2 0 2 1 2 2
Step 029:is Jump; 06:[0]&<-[1]:08; 1 1 1 2 1 2 1 2 0 2 2
Step 030:is Move; 07:[2]-&>[0]:08; 1 1 1 2 1 2 1 0 2 2 2
Step 031:is Jump; 05:[2]-&>[0]:07; 1 1 1 2 1 0 1 2 2 2 2
Step 032:is Jump; 03:[2]-&>[0]:05; 1 1 1 0 1 2 1 2 2 2 2
Step 033:is Move; 03:[0]&<-[1]:04; 1 1 1 1 0 2 1 2 2 2 2
Step 034:is Jump; 04:[0]&<-[1]:06; 1 1 1 1 1 2 0 2 2 2 2
Step 035:is Move; 05:[2]-&>[0]:06; 1 1 1 1 1 0 2 2 2 2 2
Java 編程


只用抓住同向之羊不準相鄰這個準則就能解決問題


回答這個問題是因為過去某一天作為一條研究生狗居然被五歲侄兒拿來的益智遊戲[暫且叫青蛙跳]難住了。老臉一時掛不住,希望大家遇到可以輕鬆解決五歲的問題。

遊戲規則和題主所說一致,兩邊的分別只能往前跳一步或者跳過一隻青蛙(跳過比題主所描述略嚴格)。當時還要簡單一點,兩邊分別只有三隻。

解決了之後侄兒要我教他,不過實在不能給他講201-120,於是研究了實用派方法,想要理論的可以參考一樓的回答。
好吧,據說圖比較好用,如下

這裡是設置了七隻,(算是彌補了當時只有三隻太渣渣)
實用派方法的規則如下,
1.從最靠近另一端的開始走。
2.每一輪只走其中一邊的羊,兩邊輪流交替。
3.每輪走的步數從1開始逐輪加1(也就是123456789...)上限為單邊的個數。
tip:你不用擔心不知道是往前走一步還是跳一步,因為只有一種選擇。

好,那麼現在可以開始了。

1向前走一步,2向前走兩步,1向前走三步,2向前走4步...
很快就可以到達012121212121212
相信這時候就不是難事了。

希望容易看懂可以教小孩╮(╯▽╰)╭


明顯不能。請看前提條件,「有一條很窄的隧道,每次只能容納一隻羊通過。」


感覺挺簡單的啊,三個空格兩隻羊就可以換位置,那就一步一步換就行了啊
簡述一下四隻羊的過程
2.2.0.1.1
2.2.1.0.1
2.0.21.0.1
2.0.1.2.1
2.1.0.2.1
0.21.0.2.1
0.1.2.2.1
1.2.2.1.0
1.2.0.21.0
1.2.0.1.2
1.2.1.0.2
1.0.21.0.2
1.0.1.2.2
1.1.0.2.2
其實一個好問題是如何使用最少的步驟完成交換位置的動作。


第一步,偶數跳到奇數上,這樣子,1, 0, 1/1, 0, 1/1, 0, 2/2, 0, 2/2, 0, 2,於是偶數位置空出來了。
第二步,1號羊走一步跳一步,出去了。
其餘的有樣學樣。


能啊,又沒說羊只能跳一格,直接一下跳五隻羊不就好了,飛一般的感覺,,,


你見過足球隊開始之前兩隊握手嗎?一樣的道理


推薦閱讀:

怎樣用最少的拋物線及其內部覆蓋整個平面?
根號2的根號2次方,即√2^√2是無理數嗎?
如何解釋一堆糖果與一堆糖果放在一起還是一堆糖果?
任何正有理數可以表示為以下這些,為什麼?
如何計算sqrt(tan x)在0到pi/2的定積分?

TAG:數學 | 趣味數學 | 策略 |