The black knight is our lion chasing 8 white bishop zebras which can't capture. Can the zebras evade the lion forever, if team zebra positions all the pieces and has the first turn?


  • The game is played on a standard 8x8 chess board
  • Zebras move like bishops but can't capture
  • Lions move like knights and only need to capture one zebra to win
  • The Zebra team will always play their best game to avoid capture
  • Zebras get to position all pieces to their advantage
  • Zebras can choose to first move if they desire
  • Each side moves a single piece per turn

Question: If there are 8 zebras and only 1 lion, can the lion win?

If you lion can win how does it do so? If the zebras always win (escape) where on the board do they and the lion start and what is their strategy?

While the answers so far are a good start they still don't completely answer the question. I might offer a bounty on this question and I would definitely award it to anyone who can prove that the Lion can always win. (if that is the case)

  • $\begingroup$ Do all the zebra's move at once or do they move one after the other? Also I think it really depends on the situation of the bord $\endgroup$
    – Wouter
    Commented May 19, 2015 at 7:51
  • $\begingroup$ That is the essence of the question. Can the zebras find a starting position and strategy that ensures victory. $\endgroup$
    – Bob
    Commented May 19, 2015 at 8:22
  • 2
    $\begingroup$ Tougher variant: what's the minimum number of zebras to ensure the lion can get a meal. $\endgroup$
    – weston
    Commented May 19, 2015 at 9:17
  • $\begingroup$ Is this a standard 8x8 chess board? $\endgroup$
    – LeppyR64
    Commented May 19, 2015 at 9:33
  • 8
    $\begingroup$ Uhh.. obviously, the zebras just lie down and escape the lions using the camouflage of the black and white chess board. Too easy. $\endgroup$ Commented May 19, 2015 at 15:14

4 Answers 4


I will place the Zebras as follows :

enter image description here

Then whenever the knight attacks any piece, I will move it to its adjacent diagonal so that it is contained within these boxes :

enter image description here

Now, the knight cannot fork two pieces inside same box(as they are of opposite colour). Also knight cannot fork two pieces from two boxes as they are quite apart...(4 places between them). So I will just have to make sure that the knight does not capture me in next move and I am safe...

Note that if the knight attacks from c3(only time when I will have to leave box) or such similar square I will diagonally move to the opposite box. From c3 he will have to go to e2 then g3 then f1 then e3 then his attacks will end (any other move will also mean end of attack). Then I will take back my piece to where it was. So initial condition.

  • 6
    $\begingroup$ But the knight can attack both the current position of the zebra and the one it would move to. $\endgroup$ Commented May 19, 2015 at 10:20
  • 3
    $\begingroup$ @Lawrence white in piece colour, not square. If it were square then you should be much more confused at the reference to black knight. $\endgroup$
    – LeppyR64
    Commented May 19, 2015 at 14:16
  • 2
    $\begingroup$ In the section detailing c3 how do you guarantee that the spot you are moving your zebra to doesn't contain a zebra already? If you can not guarantee this; have you considered the followup of d5 rather than e2?(blocking the return path of the zebra). $\endgroup$
    – Taemyr
    Commented May 20, 2015 at 0:49
  • 3
    $\begingroup$ Lion move sequence with initial zebras in the positions given in answer (zebras moves omitted): B4,A6,C7,B5,D6,F7,H6,F5,G3,E2,C3. Zebra move B1-H7 blocked by Zebra at H7. $\endgroup$
    – Taemyr
    Commented May 20, 2015 at 1:14
  • 2
    $\begingroup$ Oh my God! So, many things have happened since I last logged in. Sorry everyone...I had realised that my answer wasn't correct long ago. The only reason I didn't delete it is because it might inspire someone and produce an awesome solution. As for me, I am stuck in purgatorio so I can't contribute anything. However if anyone feels that my answer is misleading I will gladly delete it. $\endgroup$ Commented Oct 13, 2016 at 15:44

Note: The following full answer expands on the previous partial answer, which has been retained below.

Full answer

To analyze all the possible states, the algorithm Ken Thompson described in his 1986 paper Retrograde Analysis of Certain Endgames, which was used to develop some of the earliest chess endgame tablebases, was adapted for this question. His method starts at known winning positions and moves backward in time ("unmoves") to predecessor positions. Those positions are analyzed and the ones that always lead to defeat are added to the list of losing positions. Then new predecessor positions of the losing positions are analyzed. This continues until there are no new predecessors.

At the end of the analysis, either all possible positions have been added to the list of losing positions and a win is guaranteed with optimal play, or there is a subset of non-losing positions that can be leveraged to defend against a win.

Analysis of Lions and Zebras on a Chess Board leads to the conclusion that...

In the jungle, the mighty jungle, the lion eats tonight...

An optimal lion wins from every possible game position. Against optimal zebras each, the lion slightly improves with each move until his opponents run out of defenses. This takes 16 moves at most.

Chess board with black knight at b2 and white bishops at a1, a2, a7, a8, h1, h2, h7, and h8 Lion eats in 16

This is a typical best-case setup for the zebras. They are arrayed in the corners and the lion lacks any immediate threatening moves. But even if the zebras could dictate the lion's first move, it would offer them no advantage. All the lion's initial moves lead to a captured zebra in 16 moves.

Since the state space is too large to present a full analysis for the tens of billions of positions, the following analysis has been limited to this position. Further, it only looks at lines where the lion chooses Nd1 as his first move. It produces a number interesting lines that demonstrate the strategies without having an unmanageable number of variations.

Interestingly, in responding to Nd1, despite a plethora of options, the zebras only have two optimal replies: Bab8 and Bab1. Anything else results in earlier capture.

Analysis of the lines starting at this position are given in PGN format. Given the non-standard rules of the game, not all PGN viewers can handle them. But, as of this writing, the PGN viewer on chess.com works. (Choose Load PGN and paste in the PGN.). Zebra moves are annotated for only optimal move: '!'; suboptimal move: '?'; or highly suboptimal move: '??'.

1... Nd1 2. Bab8

In moves 3 to 11, the zebras maintain their defensive posture by occupying the corners. But they only have one optimal move at each turn. On move 12, the zebras finally two options Bab6 or Bab2, but either one forces the abandoment of the corners. Either way, the lion continues with b4, then c2, and on move 14 the a1 zebra then has four choices: b2, c3, e5, or f6. The lion continues to e3 and then no matter which of the eight combinations of moves the zebras chose on 12 and 14, the lion forks them on move 15.

[FEN "B6B/B6B/8/8/8/8/Bn5B/B6B b - - 0 1"]
[SetUp "1"] 1... Nd1 2. Bab8 Nf2 3. Bhg2! Ng4 4. Bg1! Nf6 5. Bhb1! Nd5 6. Bh7! Nb6 7. Bab7! Nd7 8. Bba7! Nf8 9. Bhg8! Ng6 10. Bhg7! Ne7 11. Bh7! Nc6 12. Bab6 Nb4 13. Bf7 Nc2 14. Bab2 Ne3 15. Bh1 Nc4 16. Ba1 Nxb6

1... Nd1 2. Bab1

The lion leaves the zebras with only a single optimal choice on moves 3 to 10. Unlike the Bab8 line, this line requires early abandonment of the corners. The zebras are finally afforded a choice on move 11, either Bc8 or Be8. But the table is already set and Nf7 forces Bhb2. The lion then threatens one zebra after another until he finally captures the a1 zebra trapped on move 12.

The amazing thing about this line is that if the zebras play optimally the lion could play blind. In optimal play, the lion can use these same moves starting at move 2 and he will always capture the zebra on a1 on move 16.

[FEN "B6B/B6B/8/8/8/8/Bn5B/B6B b - - 0 1"]
[SetUp "1"] 1... Nd1 2. Bab1 Nc3 3. Bbc2! Ne4 4. Bb1! Nf6 5. Bhf5! Ng4 6. Bhg1! Nf2 7. Bhg2! Nh3 8. Bh2! Ng5 9. Bd7! Nf3 10. Bg3! Ne5 11. Bc8 Nf7 12. Bhb2! Nd6 13. Bch3! Nb5 14. Bg1 Na3 15. Ba2 Nc2 16. Bh8 Nxa1

Other variations

The following lines show the optimal lion strategy to reach a win in five moves. The starting position is after 1... Nd1. Reviewing with a PGN viewer is recommended since there are many subvariations, and many of those deeply nested lines.


[FEN "B6B/B6B/8/8/8/8/B6B/B2n3B w - - 0 2"]
[SetUp "1"] 2. Bab8 Nf2 3. Bhg2! (3. Bhf3?? Ng4 4. Bg1! (4. Bhg3? Nf6) 4... Nf6 5. Bf5! (5. Bc2? Nd7) 5... Nd5 6. Bh7! Nc3) (3. Bhc6?? Ng4 4. Bg1! Nf6) 3... Ng4 4. Bg1! (4. Bhg3?? Nf6 5. Bc2 {or Bf5} Nd7 6. Ba7! Nb6) 4... Nf6 5. Bhb1! (5. Bc2? {or Bd3?} Nd7 6. Bba7! Ne5 7. Bh7! Nc6 8. Bac5 (8. Bab6 Nb4 9. Bab1 {or Bb3} Nc2) 8... Nb4 9. Bab1 {or Bb3/Bag8} Nc2) (5. Bg6? Nd7 6. Bba7! Ne5 7. Bh7! (7. Be8? Nc6) 7... Nc6 8. Bac5 (8. Bab6 Nb4 9. Bab1 {or Bb3} Nc2) 8... Nb4 9. Bab1 {or Bb3/Bag8} Nc2) (5. Bf5?? Nd7 6. Bba7! Nb6) 5... Nd5 6. Bh7! (6. Bb3?? Nb6) 6... Nb6 7. Bab7! (7. Bac6?? Nd7 8. Bba7! Nf6) 7... Nd7 8. Bba7! (8. Bd6?? Nf6) 8... Nf8 9. Bhg8! (9. Bc2? Ng6 10. Bhg7! Nf4) 9... Ng6 10. Bhg7! (10. Bhf6? Nf4) 10... Ne7 11. Bh7! Nc6


[FEN "B6B/B6B/8/8/8/8/B6B/B2n3B w - - 0 2"]
[SetUp "1"] 2. Bab1 Nc3 3. Bbc2! (3. Bbg6?? Ne4 4. Bg8! Ng3 5. Bhf3! Nf5 6. Bgh5! Ne3 7. Ba2! Nc2) (3. Bbd3?? Nb5 4. Bab8! (4. Bag1? {or Be3?} Nd4) (4. Bf2? {or Bb6?} Nc7) 4... Nc7 5. Baf3! Na6 6. Ba7! Nc5) (3. Bbf5?? Ne4 4. Bc8! Nf2 5. Bhg2 {or Bhf3} (5. Bhc6 Ne4 6. Ba6! Ng5) 5... Ng4 6. Bhg1 (6. Bg3 Ne3) 6... Nf6) 3... Ne4 4. Bb1! (4. Bb3? Ng5 5. Bhg8! (5. Bg6?? Nf7) 5... Nf7 6. Bhg7! (6. Bhc3? Ne5 7. Ba2! Nf3) 6... Nh6 7. Bh7! Ng4 8. Bhg1 (8. Bhb8 Nf6 9. Bb1 (9. Bg6 Nd5) 9... Ne4) 8... Nf2 9. Bhg2! Nh3) (4. Ba4?? Nd6 5. Bd1 (5. Bac2 Nf7 6. Bhf6! Ng5 7. Bg8! (7. Bhg6? Nf3) 7... Nf3 8. Bg3! Nd4) (5. Bf2 Nf7 6. Bhg7! Ng5 7. Bg8! (7. Bg6? Nf3) 7... Ne4 8. Bfg1 (8. Ba7 Ng3) 8... Nf2) (5. Bb8 Nf7 6. Bhg7! (6. Bhc3? Ne5) 6... Ng5 7. Bb1! (7. Bg8? Nf3) 7... Ne6 8. Bh8! Nc7) (5. Bb3? Nf7 6. Bhf6! Ng5 7. Bg6 {or Bhg8} Nf3) (5. B8c6?? {or B4c6??} Nf7) 5... Nc8 6. Bag1! (6. Bf2? {or Be3?/B7d4?/Bc5?/Bab8?} Nb6) 6... Nb6 7. Bab7! Nd7 8. Bc7! Nc5) (4. Bhg1?? Nf2 5. Bhg2! (5. Bhd5? {or Bhb7?} Nh3 6. Bh2! Ng5) (5. Bhc6? Nh3) 5... Nh3 6. Bgc5! (6. Bgb6? Ng5) 6... Nf4 7. Bh1! Ng6) (4. Bb7?? Ng5 5. Bg8! (5. Bhg6? Nf7) 5... Nf7 6. Bhg7! Nd6 7. Ba8! Nc8) (4. Bg8?? Nf2 5. Bhf3 (5. Bhc6 Ng4 6. Bhg1! Nf6) 5... Ng4 6. Bhg1! Nh6) (4. Bab8?? Nf2 5. Bhf3! Ng4 6. Bg1 {or Bhg3} Nf6) (4. Bf4?? Nf2 5. Bhb7! Ne4) (4. Bc7?? Ng3 5. Bhg2! Nf5) (4. Bhb8?? Ng5 5. Bg8! Nf7) (4. Bb6?? {or Bg6??/Bab2??} Nf2) 4... Nf6 5. Bhf5! (5. Bhg6? Ng4 6. Bhg1! (6. Bg3?? Nf2 7. Bhg2! Ne4) (6. Bc7?? Ne5 7. Bh5 (7. Bh7 Nf7) 7... Ng6) 6... Nf2 7. Bhf3! (7. Bhc6? Ne4 8. Bh5 (8. Bc2 Nd2 9. Bh1! Nb3) (8. Bh7? {or Ba2?} Nc3) 8... Nd2 9. Ba2! Nb3) (7. Bhb7? Nh3 8. Bh2! Nf4 9. Bh7! Ng6) 7... Ne4 8. Bh1! (8. Bc2? Nd2 9. Bh1! Nb3) (8. Ba2? Nc3) 8... Ng3 9. Bhf3! Ne2 10. Bgf2 {or Bh2} Nc3) (5. Bhc2?? Ne4 6. Ba2! Nf2) 5... Ng4 6. Bhg1! (6. Bhb8? Ne5 7. Bg1! (7. Bf2? Nd7 8. Bh2 (8. Bba7 {or Bc7} Nb6) 8... Ne5) 7... Nf3 8. Bb6! Nd2 9. Ba2! Nb3) (6. Bg3?? Nf2 7. Bhg2! Ne4) (6. Bf4?? Ne5 7. Bg3! Ng6) 6... Nf2 7. Bhg2! (7. Bhf3?? Nh3 8. Bh2! Ng1) (7. Bhd5?? Nd1 8. Bg8! Nc3) (7. Bhc6?? Ne4 8. Bh3 {or Bh7} Nc3) 7... Nh3 8. Bh2! (8. Bgc5? Nf4 9. Bh1! Ne2) (8. Bge3?? Ng5) 8... Ng5 9. Bd7! (9. Bc8? Nf7 10. Bhf6 {or Bhg7} Nd6) (9. Bg3? Ne4) (9. Bhb8? Nf7) 9... Nf3 10. Bg3! Ne5 11. Bc8 {or Be8} Nf7


[FEN "B6B/B6B/8/8/8/8/B6B/B2n3B w - - 0 2"]
[SetUp "1"] 2. Bag1? Nf2 3. Bhg2! (3. Bhc6?? Ng4 4. Bb8! Nf6) 3... Nh3 4. Ba7! (4. Bc5? Ng5 5. Bhg8! Nf3 6. Bg3! Nd4 7. Ba7! Nc6) (4. Bb6?? Ng5 5. Bhb1 (5. Bhg8 Nf7 6. Bhg7! Nh6) 5... Nf3 6. Bg3 (6. Bb8 Ne5) 6... Ne1) 4... Ng5 5. Bhg8! (5. Bhb1? Nf3 6. Bg3! Nh4 7. Bf1 {or Bh1} Ng6 8. Bhg7! Nf4) 5... Nf3 6. Bg3 (6. Bc7 Nd4 7. Bh2! (7. Bg3? Nc6) 7... Nc6 8. Bc5 {or Bb6} Nb4 9. Bb1 {or Bab3} Nc2) 6... Nh4 7. Bh1! (7. Bf1? Ng6 8. Bhc3 {or Bhf6} Ne7) (7. Bh3? {or Bge4?} Ng6) 7... Ng6 8. Bhc3 (8. Bhf6 Ne7 9. Bh7! Nc8) 8... Ne7 9. Bh7! Nc6


[FEN "B6B/B6B/8/8/8/8/B6B/B2n3B w - - 0 2"]
[SetUp "1"] 2. Bhg1? Nf2 3. Bhg2! (3. Bhd5?? Ne4 4. Bdc4! (4. Bdc6? Nf6) 4... Ng5 5. Bhg8! Nf3 6. Bgf2! Nd2) (3. Bhc6?? Ne4 4. Bb1 {or Bg6/Bhg7/Bhg8} (4. Bb8 {or Bh2} Nf6) 4... Nc3) (3. Bhb7?? Ne4 4. Bc6 {or Bc8} Nf6) 3... Nh3 4. Bh2! (4. Bgb6? Ng5 5. Bhg8! Nf7 6. Bhg7! (6. Bhf6? Nh6) 6... Nh6 7. Bh7! Nf5) (4. Bge3?? Ng5 5. Bhg8! (5. Bhb1? Ne4) 5... Nf7 6. Bhc3! Nh6) (4. Bgd4?? Ng5 5. Bhg8! Nf7) (4. Bgc5?? Nf4 5. Bf1 {or Bh1} Ng6) 4... Ng5 5. Bhg8! (5. Bhb1? Nf3 6. Bg3! Nh4 7. Bf1 {or Bh1} Ng6 8. Bhg7! Nf4) 5... Nf3 6. Bg3 (6. Bc7 Nd4 7. Bh2! (7. Bg3? Nc6) 7... Nc6 8. Bc5 {or Bb6} Nb4 9. Bb1 {or Bab3} Nc2) 6... Nh4 7. Bh1! (7. Bf1? Ng6 8. Bhc3 {or Bhf6} Ne7) (7. Bh3? {or Bge4?} Ng6) 7... Ng6 8. Bhc3 (8. Bhf6 Ne7 9. Bh7! Nc8) 8... Ne7 9. Bh7! Nc6


[FEN "B6B/B6B/8/8/8/8/B6B/B2n3B w - - 0 2"]
[SetUp "1"] 2. Bab7? Nf2 3. Bhg2! (3. Bhf3? Ng4 4. Bhg1! (4. Bg3?? Nf6) 4... Nf6 5. Bg6! (5. Bc2? Nd5 6. Bh7! Nc3) 5... Ne4 6. Bh1! (6. Bgh5? {or Ba8?} Nc3) (6. Ba6? Nd2) 6... Ng3 7. Bhf3! Ne2 8. Bh2! Nc1) (3. Bhc6?? Ne4 4. Ba8! Nf6) 3... Ng4 4. Bhg1! (4. Bg3?? Nf6) 4... Ne3 5. Bh1! (5. Bh3?? Nc2 6. Baf6! Na3) (5. Bgf3?? {or Bge4??} Nc2) 5... Nc2 6. Bac3! (6. Bab2? Nb4 7. Bab1 {or Bag8} Nc6) (6. Baf6? Nb4 7. Bab1! Nc6) 6... Nb4 7. Bab1! Nc6 8. Bab6! Na5 9. Ba6 {or Ba8} Nc4


[FEN "B6B/B6B/8/8/8/8/B6B/B2n3B w - - 0 2"]
[SetUp "1"] 2. Bhg8? Nc3 3. Bac4! (3. Bab3? Nb5 4. Bab8! (4. Bf2?? Nd4 5. Ba2 {or Ba4} Nc2) (4. Bb6?? Nc7 5. Bab7! Nd5) 4... Nc7 5. Bac6! (5. Bag2? Nd5 6. Bf7! Nf4 7. Ba8! Ng6) (5. Baf3? Nd5 6. Bf7 (6. Ba4 Ne7 7. Bh7! Ng6) (6. Ba2? {or Bh7?} Nf6) 6... Ne7 7. Ba8! Ng6) 5... Nd5 6. Ba8! (6. Bf7? Ne7 7. Ba8! Ng6) (6. Bh7? Nf6) 6... Nb6 7. Bac6! Nd7 8. Ba7 {or Bbc7} Nf6) (3. Baf7?? Nd5 4. Bh7! Nc7) 3... Nb5 4. Bab8! (4. Bag1? Nd4 5. Bb8! (5. Bc7? Ne2 6. Bf2 {or Bgh2} (6. Ba7 Nd4) 6... Ng3) 5... Nc6 6. Bg3! Ne7 7. Bh7! Ng6) (4. Bc5?? Nd4 5. Bb6! Nc2) (4. Bb6?? Nc7 5. Bab7! Nd5) 4... Nc7 5. Bab7! (5. Baf3?? Nd5 6. Ba2 {or Ba6} Nf6) (5. Bae4?? Nd5 6. Bb1! Nf6) (5. Bac6?? Nd5 6. B6b5! Nf6) 5... Na6 6. Ba7! (6. Bbf4? Nc5 7. Ba8! Nb3) (6. Bbd6?? Nb4) 6... Nb4 7. Be2! (7. Bf1? Nc2 8. Bab2 {or Bac3} Ne3) (7. Bag1? {or Bb6?} Nc2) 7... Nc6 8. Bb6! Nd4 9. Bd1 {or Bf1} Nc2


[FEN "B6B/B6B/8/8/8/8/B6B/B2n3B w - - 0 2"]
[SetUp "1"] 2. Bb3? Nf2 3. Bhg2! (3. Bhf3? Ng4 4. Bhg1! Nf6 5. Bg6! (5. Bd3? Ne4 6. Bg8! Ng5) 5... Ne4 6. Bg8! (6. Bc2? Nd2 7. Bh1! Nb3) (6. Bfd1? {or Ba2?} Nc3) (6. Bh1? {or Be2?/Bfh5?} Ng3) 6... Nd6 7. Bb1! (7. Bgh5? Nc8) 7... Nc8 8. Bb8! Nb6) (3. Bhc6?? Ng4 4. Bhg1 {or Bg3} Nf6) (3. Bhb7?? Ng4 4. Bhg1! Nf6) 3... Ne4 4. Bh1 (4. Ba2 Ng5 5. Bhg8! (5. Bhb1? Nf3 6. Bg3! Nh4 7. Bf1 {or Bh1} Ng6 8. Bhg7! Nf4) 5... Nf3 6. Bg3 (6. Bc7 Nd4 7. Bh2! (7. Bg3? Nc6) 7... Nc6 8. Bc5 {or Bb6} Nb4 9. Bb1 {or Bab3} Nc2) 6... Nh4 7. Bh1! (7. Bf1? Ng6 8. Bhc3 {or Bhf6} Ne7) (7. Bh3? {or Bge4?} Ng6) 7... Ng6 8. Bhc3 (8. Bhf6 Ne7 9. Bh7! Nc8) 8... Ne7 9. Bh7! Nc6) (4. Bhg1? Ng5 5. Bhg8! Nf3 6. Bgf2! Nd4 7. Ba2 {or Ba4} Nc2) (4. Bhg8? Nf6 5. Bgf7! Ng4 6. Bhg1 (6. Bg3 Ne5 7. Be8 {or Bg8} Nc6) 6... Ne3 7. Bh1! Nc2) (4. Bab8? Nf6 5. Bg6! (5. Bb1? Nd7 6. Ba7 {or Bbc7} Nb6) 5... Nd7 6. Ba7! Nb6 7. Bab7! Nc8) (4. Ba4?? Ng5 5. Bb1 (5. Bg8 Nf3 6. Bg3 {or Bc7} Nh4) 5... Nf3 6. Bg3! Nd4) (4. Bf4?? Nf6 5. Bb1! Nd5) (4. Bhb8?? Ng5 5. Bb1 (5. Bhg8 Nf7) 5... Nf3) (4. Bab2?? Nf6 5. Bg6! Ng4) (4. Bb6?? {or Bc7??} Nf6) 4... Ng5 5. Bhg8! (5. Bg6?? Nf7) 5... Nf7 6. Bhg7! (6. Bhc3? Ne5 7. Ba2! Nf3) 6... Nh6 7. Bh7! Ng4 8. Bhg1 (8. Bhb8 Nf6 9. Bb1 (9. Bg6 Nd5) 9... Ne4) 8... Nf2 9. Bhg2! Nh3


[FEN "B6B/B6B/8/8/8/8/B6B/B2n3B w - - 0 2"]
[SetUp "1"] 2. Bhg2? Nc3 3. Bag8! (3. Bb3? Nb5 4. Bab8! (4. Bb6?? Nd4 5. Ba2! Nc2) 4... Nc7 5. Bac6! (5. Baf3? Nd5 6. Bh1 (6. Ba4 Nc3) (6. Bh3 Ne3) 6... Nf6) 5... Nd5 6. Ba8! (6. Bh1? {or Bba4?} Nf6) (6. Bh3? Ne3) 6... Nb6 7. Bac6! Nd7 8. Ba7! Nf6) (3. Bc4? Nb5 4. Bab8! Nc7 5. Bab7! Na6 6. Ba7! (6. Bbd6? Nb4) 6... Nb4 7. Be2! Nc2 8. Bab2! Ne3) (3. Bf7?? Nb5 4. Bab8! (4. Bf2? {or Bb6?} Nc7) 4... Nc7 5. Bac6! Ne6 6. Bfe8! Nd4) 3... Nd5 4. Bb1! (4. Bf7?? Nc7) 4... Nc7 5. Bab7! (5. Bac6?? Nb5 6. Bab8! Na3) 5... Nb5 6. Bab8! (6. Bc5?? Nc3) 6... Na3 7. Bba2! (7. Bg6? Nc2 8. Bab2! Ne3) 7... Nc2 8. Bab2! (8. Bac3? Ne3) 8... Nb4 9. Bb1! Nc6

Bhb8??, Bg3??

[FEN "B6B/B6B/8/8/8/8/B6B/B2n3B w - - 0 2"]
[SetUp "1"] 2. Bhb8?? (2. Bg3?? Nc3 3. Bb3! (3. Bc4?? Ne4 4. Be1 {or Bh4} (4. Bh2 Nf2) 4... Ng3) 3... Nb5 4. Bab8! (4. Bb6? Nc7 5. Bac6! Nd5 6. Ba7 (6. Bd8 Nc3) 6... Nf6) (4. Baf2?? Nc7) 4... Nc7 5. Bac6! Na6 6. Ba7! Nc5 7. Ba2! Ne4 8. Bh2! Nf2) 2... Nc3 3. Bb3! (3. Bf7? Nb5 4. Bg1! (4. Bf2? Nc7 5. Bac6! Na6 6. Bba7! Nc5) (4. Be3?? {or Bb6??} Nc7) 4... Nc7 5. Bac6! Ne6 6. Bfe8! Nc5 7. Bb1! Nb3) (3. Bc4?? Nd5 4. Bf1 (4. Be2 Nf6 5. Bc2 {or Bhd3/Bg6} Ne4) (4. Bb3? Nb6) 4... Ne3 5. Bh3! Nc2) (3. Bag8?? Nd5 4. Bf7! Nb6) 3... Nb5 4. Bg1! (4. Bf2?? {or Bb6??} Nc7) 4... Nc7 5. Bac6! (5. Baf3? Nd5 6. Bfd1 (6. Ba2 {or Ba4} Nc3) (6. Bbc2 {or Bba7/Bgh2/Bab2} Nf6) (6. Be2 Nf4) 6... Ne3) 5... Nd5 6. Bba7 (6. Ba8 Nb6 7. Baf3 (7. Bac6 Nd7 8. Bba7! Nf8) 7... Nd7 8. Bba7! Nf6) (6. Bd1? {or Bb5?/Bf2?/Bgh2?/Bab2?} Nf6) 6... Nf6 7. Bb1 (7. Bg6 Ne4 8. Ba8 {or Bce8} Ng3) 7... Ne4 8. Bg8! Ng3

Bg6??, Be6??

[FEN "B6B/B6B/8/8/8/8/B6B/B2n3B w - - 0 2"]
[SetUp "1"] 2. Bg6?? (2. Be6?? Nf2 3. Bhg2! Ng4 4. Bhg1! Ne5 5. Ba2 (5. Bb3 Nc6 6. Bab6! Nd4 7. Ba2! Nc2) (5. Bc8? Nc6) (5. Beg8? Ng6) 5... Nc6 6. Bac5 (6. Bab6 Nb4 7. Bab1 {or Bb3} Nc2) 6... Nb4 7. Bab1 {or Bb3/Bag8} Nc2) 2... Nf2 3. Bhg2! (3. Bhb7? Ne4 4. Bc8! (4. Bc6? Nc3) 4... Nc3 5. Bb3! Nb5) 3... Ng4 4. Bhg1! (4. Bg3? Ne5 5. Bh7 (5. Be8 Nc6) 5... Ng6) (4. Bc7? Ne5 5. Bh7! Ng6) 4... Ne3 5. Bh1! (5. Bh3? {or B2e4?} Nc2) 5... Nc2 6. Bac3! Nb4 7. Bab1! Nc6

Bf7??, Bc5??, Bf5??

[FEN "B6B/B6B/8/8/8/8/B6B/B2n3B w - - 0 2"]
[SetUp "1"] 2. Bf7?? (2. Bc5?? Nf2 3. Bhg2! Ng4 4. Bhg1! Nf6 5. Bc2 {or Bf5} Nd5) (2. Bf5?? Nf2 3. Bhf3! Ng4 4. Bhg1! (4. Bg3? Nh2) 4... Ne3 5. Bh3 {or Bh7} Nc2)2... Nf2 3. Bhg2! Ng4 4. Bhg1! (4. Bg3? Ne5 5. Ba2 (5. Bb3 Nc6) 5... Ng6) (4. Bc7? Ne5 5. Ba2 {or Bb3} Ng6) 4... Ne5 5. Ba2 (5. Bb3 Nc6 6. Bab6! Nd4 7. Ba2! Nc2) (5. Be8? {or Bfg8?} Ng6) 5... Nc6 6. Bac5 (6. Bab6 Nb4 7. Bab1 {or Bb3} Nc2) 6... Nb4 7. Bab1 {or Bb3/Bag8} Nc2

The rest

[FEN "B6B/B6B/8/8/8/8/B6B/B2n3B w - - 0 2"]
[SetUp "1"] 2. Bb6?? (2. Baf3?? {or Bhf3??} Nc3) (2. Bc2?? {or B7d4??/Bac6??/Bc4??} Nf2) (2. Bag7?? Nf2 3. Bhg2! Ng4) (2. Bhc6?? Nc3 3. Bc4! Nb5 4. Bab8! Nc7) (2. B2e5?? Nc3 3. Bb3! Nb5 4. Bf2! Nd4) (2. Bf4?? Nc3 3. Bb3! Nb5 4. Bf2 {or Bab8} Nc7) (2. Bhg7?? Nc3 3. Bb3 {or Bc4} Nb5 4. Bb6 {or Bab8} Nc7) 2... Nf2 3. Bhf3! Ng4 4. Bhg1 {or Bg3} Nf6


The preceding variations demonstrate the tactics adopted by the lion versus various zebra defenses. It's not possible to present the full analysis, but the final result is the lion always wins.

Partial answer

Note: This was the first cut at the game analysis prior to the full analysis done above.

If we limit the zebras to execute the four-corners strategy suggested in other answers, the problem is more manageable. An analyzing every state where the zebras restrict themselves to the four squares in each corner shows that this strategy is unsustainable. Sooner or later, the zebras have to abandon those squares.

To demonstrate this, I implemented a Python program to with an optimal lion. (It should work in both Python 2.7 and Python 3.x, but let me know if it not.) The user takes the role of the zebras. To reduce the state space, I limited the zebras to having four on white and four on black with two zebras on each long diagonal. This is the optimal organization for the zebras when playing the four corners.

Once the program is started, you receive a command prompt.

To create an initial position, use the start command followed by {l}:{z1}{z2}...{z8} where {l} is the lion's square and {zn} is each zebra's square. For instance, to use the position shown in Prem's answer use:

start d5:a1a2a7a8h1h2h7h8 

The lion will move and the next position shown. To move just enter a move for a zebra, which must be to one of the corner squares. For example:


The zebra move will be shown, along with the optimal reply from the lion.

To take back the last move:


And to leave the program:


Optimal Lion vs. Four-Corner Zebras Demo

from cmd import Cmd
from itertools import product, combinations, starmap, chain
from functools import reduce
from zlib import decompress
from base64 import b64decode
import sys
import re


VALID_SQUARES = tuple(product(range(8), repeat=2))

ZSQUARE_GROUPS = (((0,0),(1,1),(6,6),(7,7)), ((0,1),(1,0),(6,7),(7,6)),
                  ((0,7),(1,6),(6,1),(7,0)), ((0,6),(1,7),(6,0),(7,1)))

ALL_CORNERS = reduce(frozenset.union, ZSQUARE_GROUPS, frozenset())

def comb2(iterable): return combinations(iterable, 2)
Z_STATES = list(map(frozenset, starmap(chain, product(*map(comb2, ZSQUARE_GROUPS)))))

LNORM_POS = ((0,0),(2,0),(4,0),(6,0),(1,1),(3,1),(5,1),(2,2),(4,2),(3,3))

pos_combos = [[i in c for i in range(4)] for c in combinations(range(4), 2)]

LMOVE_DELTAS = ((-2,-1),(-2,1),(-1,-2),(-1,2),(1,-2),(1,2),(2,-1),(2,1))

def map_lmoves(l_pos, move_data):
    return (l_pos, dict(zip(Z_STATES, bytearray(decompress(b64decode(move_data))))))

LMOVE_LU = dict(map(map_lmoves, LNORM_POS, LMOVES_COMPRESSED))

def str2id(s): return (ord(s[0])-ord('a'), ord(s[1])-ord('1'))
def id2str(id): return chr(ord('a')+id[0])+chr(ord('1')+id[1])
def move2str(move): return "%s%s" % (id2str(move[0]), id2str(move[1]))
def str2move(s): return (str2id(s[:2]), str2id(s[2:]))
def refl_a1h8(id): return (id[1],id[0])
def refl_a8h1(id): return (7-id[1],7-id[0])
def refl_lr(id): return (7-id[0],id[1])

def get_l_move(l_sq, z_sqs):
    norm_fs = []
    if l_sq[1]>7-l_sq[0]:   norm_fs.append(refl_a8h1)
    if l_sq[1]>l_sq[0]:     norm_fs.append(refl_a1h8)
    if 1&(l_sq[0]^l_sq[1]): norm_fs.append(refl_lr)

    l_norm_sq, z_norm_sqs = l_sq, z_sqs
    for f in norm_fs:
        l_norm_sq, z_norm_sqs = f(l_norm_sq), map(f, z_norm_sqs)
    d_f, d_r = LMOVE_DELTAS[LMOVE_LU[l_norm_sq][frozenset(z_norm_sqs)]]
    l_next_sq = (l_norm_sq[0]+d_f, l_norm_sq[1]+d_r)
    for f in norm_fs[::-1]: l_next_sq = f(l_next_sq)
    return l_next_sq

def get_z_cands(l_sq, z_sqs):
    cands = []
    for z_sq in z_sqs:
        for d_f, d_r in product((-1,1), repeat=2):
            z_next = (z_sq[0]+d_f, z_sq[1]+d_r)
            while z_next in VALID_SQUARES:
                if  z_next == l_sq or z_next in z_sqs:
                if z_next in ALL_CORNERS:
                    cands.append((z_sq, z_next))
                z_next = (z_next[0]+d_f, z_next[1]+d_r)
    return cands

def print_board(l_sq, z_sqs):
    def square_c(i, j): return ' Lz'[(i,j)==l_sq or ((i,j) in z_sqs and 2)]
    for r in range(7,-1,-1):
        line = '|%s| %d' % ('|'.join([square_c(f,r) for f in range(8)]), r+1)
        sys.stdout.write('%s\n+-+-+-+-+-+-+-+-+\n' % line)
    sys.stdout.write(' a b c d e f g h\n')

class ZLCmd(Cmd):
    def __init__(self):
        self.phases = []

    def init_game(self, sstr):
        match = re.match(r"([a-h][1-8]):(([abgh][1278]){8})$", sstr)
        if match is None:
            raise RuntimeError('Invalid position definition string')
        l_str, z_str, _ = match.groups()
        l_sq = str2id(l_str)
        z_sqs = frozenset(str2id(z_str[2*i:2*i+2]) for i in range(8))
        if l_sq in z_sqs:
            raise RuntimeError('Lion position overlaps zebras')
        if not all([2==len(z_sqs.intersection(group)) for group in ZSQUARE_GROUPS]):
            raise RuntimeError('Invalid zebra positions')

        self.phases = []
        self.l_move(None, l_sq, z_sqs)

    def print_last_phase(self):
        if len(self.phases) > 0:
            phase = self.phases[-1]
            l0, l1 = phase['l_move']
            z_sqs = phase['z_sqs']
            print_board(l0, z_sqs)
            sys.stdout.write('\nL move: %s\n\n' % move2str((l0,l1)))
            print_board(l1, z_sqs)
            if len(phase['z_cands']) == 0:
                sys.stdout.write('\nGame over\n')
            sys.stdout.write('**No active game**\n')

    def l_move(self, z_move, l_sq, z_sqs):
        l_next_sq = get_l_move(l_sq, z_sqs)
        if l_next_sq in z_sqs:
            # z_sqs = z_sqs.difference((l_next_sq,))
            z_cands = []
            z_cands = get_z_cands(l_next_sq, z_sqs)

        z_cands = dict((move2str(z_cand), z_cand) for z_cand in z_cands)

        self.phases.append({'z_move': z_move, 'z_sqs': z_sqs,
                            'l_move': (l_sq, l_next_sq), 'z_cands': z_cands})


    def z_move(self, move):
        phase = self.phases[-1]
        l_sq, z_sqs = phase['l_move'][1], phase['z_sqs']
        self.l_move(move, l_sq, z_sqs.symmetric_difference(move))

    def do_quit(self, line):
        """Quit the program."""
        return True

    def do_undo(self, line):
        """Undo last move."""
        if len(self.phases) > 1:
            sys.stdout.write('Cannot undo\n')

    def do_start(self, line):
        """Start at a new position.

        Example: start b1:a1a2a7a8h1h2h7h8
            if len(line.split()) != 1:
                raise RuntimeError('Invalid number of arguments')
        except RuntimeError as e:
            sys.stdout.write('Error: %s\n' % str(e))

    def default(self, line):
        if re.match(r"([abcdefgh][12345678]){2}$", line):
            if len(self.phases) > 0 and line in self.phases[-1]['z_cands']:
                sys.stdout.write('Error: Invalid move, %s\n' % line)
            Cmd.default(self, line)

if __name__=='__main__':
    except Exception as e:
        sys.stderr.write('Fatal error: %s\n' % str(e))
  • $\begingroup$ Can you explain what you call optimal (how does the lion react)? Going through code is hard and evrybody is not a master in Python. Thanks for the script however! $\endgroup$
    – Untitpoi
    Commented Jan 23, 2018 at 8:35
  • $\begingroup$ @Untitpoi By optimal I mean that the lion always plays moves that lead him closer to the capturing a zebra. The bulk of the code is a compressed table that just holds the lion's optimal move for each state. It wasn't really intended to be read, but just to allow people to play the four-corner defense against an optimal lion and show that that strategy does not hold. In a comment on the OP, justhalf asked if someone could analyze the answers given, so that's what this partial answer is. $\endgroup$
    – D Krueger
    Commented Jan 23, 2018 at 10:02
  • $\begingroup$ So, after 3 years the problem seems to be finally solved. $\endgroup$ Commented Mar 7, 2018 at 6:37
  • $\begingroup$ @UserNotFound I tried for some time to find a way to present a complete proof, but failed. It's fascinating how nuanced the game is. Maybe I'll endeavor a little more to reduce the full state space into something that will fit in an answer. $\endgroup$
    – D Krueger
    Commented Mar 7, 2018 at 12:52
  • $\begingroup$ Is there any simple way to show that the lion wins in all other combinations of light/dark-square zebras? The lion's victory stems from its ability to find ways of moving twice for each light-square zebra move. If there were fewer dark-square zebras, it might not be able to find all the opportunities it might need. I'd guess that the lion would gain more advantage by having extra light-square targets than it would lose by having fewer dark-square ones, but can that be easily proven? $\endgroup$
    – supercat
    Commented May 14, 2018 at 20:26

Place 4 Zebras on White, and 4 Zebras on Black.
At any move, Lion can attack only Black or only White, so only 4 pieces.

Keep the 4 Black Zebras in the 4 corners, or adjacent to the corners.
Keep the 4 White Zebras in the 4 corners, or adjacent to the corners.
Now, only one Zebra can be in danger at any move. So only move that Zebra to the opposite corner.

Conclusion : Zebras can always escape.

In the figure , the blue lines are two possible ways to attack the left top corner Zebras, but the gray lines are the responses to escape. Same applies for all other corners.

Escape Algorithm Overview :
The Lion can be in only one of the 4 big quadrants (left bottom, left top, right bottom, right top) and so it can attack only one of the two Zebras in that quadrant. That Zebra has to move to the opposite corner.
If the Lion also moves to that opposite quadrant, then that Zebra must go back to initial position.
If the Lion moves to any other quadrant, then one Zebra from that quadrant will so move to opposite quadrant.
If a piece may come into danger by moving, then simply move a Zebra of the other colour.

Definition of opposite corner :
For the Zebras, there are 8 corners formed by left/right or top/bottom or inner/outer. For getting opposite, all 3 Dimensions must change: left must become right and vice-versa , top must become bottom and vice-versa , inner must become outer and vice-versa. Example : top-left-outer corner is opposite of bottom-right-inner corner.

Aim of every move is Either (1) If a piece is in danger, move that piece to opposite corner Or (2) If no piece is in danger, (2A) Move a piece back to original position, provided it is a safe move and the Lion is not blocking the way Or (2B) Move a piece of the opposite colour, so that no piece comes into danger by that move Or (2C) Move a Zebra of the same colour and the same quadrant as the Zebra blocked by the Lion in case (2A).

Explanation of (2C) : When Lion moves from D5 to C3, one Zebra moves from A2 to G8. Now if Lion moves back to D5, Zebra can not use condition (2A) to go back to original position A2, because L is blocking the way. So we have to use condition (2C) to move one Zebra from H7 to B1. Still we are maintaining 2 Zebras of opposite colour in each quadrant.

Position + Moves

Special thanks to @Wouter & @Taemyr & @JonTheMon & @JS1 for useful comments , which improved this answer.

  • $\begingroup$ can you visualize this? I would appreciate that :) $\endgroup$
    – Wouter
    Commented May 19, 2015 at 12:08
  • $\begingroup$ @Wouter , Done. $\endgroup$
    – Prem
    Commented May 19, 2015 at 12:32
  • $\begingroup$ When you move the zebra to the other corner you have two zebras on that color in that corner. Can you guarantee that it will be safely able to get back to the original corner? $\endgroup$
    – Taemyr
    Commented May 19, 2015 at 13:02
  • $\begingroup$ @Taemyr , Well, the Lion will take many moves to come to that corner, so in the meantime the Zebras have to come back to the initial positions. $\endgroup$
    – Prem
    Commented May 19, 2015 at 13:03
  • 2
    $\begingroup$ @Prem Starting from your picture, lion moves: C7 B5 C3 E2 G3 H1 killing the zebra on H1 because it is trapped by the zebra at G2. $\endgroup$
    – JS1
    Commented May 20, 2015 at 20:24

Ok, let's try to think outside of the box (literally) and let the lion move outside the 8x8. Using the 2x2 in the corners strat for Zebras and Prem's starting board.

Let's go with: D5, C3, B5, A'6. This brings up a fork on in the top left. That zebra will flee to the bottom right.

Lion A8. This brings up 2 moves for the zebras: G8 to A2 (plus mirror), G2 to B7 (zebras are safe next to lion).

Zebra G8 to A2, Lion C9. Zebra can't return to A8 or B7. Lion goes D7, F6, G4, all moves that force a zebra to move. At that point, F2 catches the zebra that's stuck at H1.

How about zebra to B7. Again lion goes D7 (zebra back to G2), F6, G4, F2 catches the zebra stuck at H1 again.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.