将棋パズルの最少手数解は?

 投稿者:GAI  投稿日:2013年 6月12日(水)06時40分52秒
  ttp://www.lcv.ne.jp/~hhase/memo/m03_02a.html
のページに将棋盤のパズル:飛角の入れ替え
という2月15日(土)の記事があります。
以前このパズルに挑戦したとき、99手かかる手数を見つけてこれが最少手数であろうと

1八飛、2八銀、3九金、4九玉、5九金、6九銀、7八金、6八銀左、7九角、8八金、

9八金、7八銀、6九金、5九銀、6八角、7九金、8八金、7九角、6八銀、5九玉、

6九玉、4九金寄、5九金、4九銀、3八金、3九銀、4八銀右、3九金、3八飛、2八金、

1八金、3九銀、2八銀、4八飛、3八銀、4九金、3九金、4九飛、5九銀、4八銀、

6八角、7九玉、6九飛、4九金、3九銀左、5九角、4八角、6八玉、5九玉、7九飛、

6九銀、6八銀、6九飛、7九銀、7八金、6八金、8八金、7八金左、8八銀、7九飛、

6九金、6八金寄、7八飛、7九銀、9八飛、8八銀、7八金寄、7九金寄、6九玉、

5九金、4九銀、3八銀右、3九角、4八銀、4九金、5九銀、6八銀、5九金、4八角、

4九銀、3九銀、3八銀右、3九角、4八銀、4九銀、2八金、3八金、2八角、3九銀、

4八金寄、3八銀左、4九金左、5九玉、6九金、7九銀右、6八金寄、7八銀、7九銀、8八飛
まで、99手。


確信していたのですが、ここにこれを51手で達成できると記載されていて衝撃を受けています。
その手順をどうしても知りたくて調査願えませんでしょうか?
 

Re: 将棋パズルの最少手数解は?

 投稿者:山中和義  投稿日:2013年 6月24日(月)09時30分28秒
  > No.3076[元記事へ]

GAIさんへのお返事です。

> のページに将棋盤のパズル:飛角の入れ替え
> という2月15日(土)の記事があります。
> 以前このパズルに挑戦したとき、99手かかる手数を見つけてこれが最少手数であろうと
> 確信していたのですが、ここにこれを51手で達成できると記載されていて衝撃を受けています。
> その手順をどうしても知りたくて調査願えませんでしょうか?

現状、51手は見つかっていません。
8パズル、16パズルと同等な計算時間が必要で、制限(枝刈り)なしでは深さが51は手も足もでません。

(貧欲法、欲張り法)
角が左に移動する最適解を求めて、飛車が右に移動する最適解を求めると、

59 手
0: 飛銀金 金銀角
  ×銀金玉金銀×

1: 飛銀金金 銀角
  ×銀金玉金銀×

2: 飛銀金金玉銀角
  ×銀金 金銀×

3: 飛銀金金玉銀角
  ×銀金金 銀×

4: 飛銀金金玉 角
  ×銀金金銀銀×

5: 飛銀金金 玉角
  ×銀金金銀銀×

6: 飛銀金金銀玉角
  ×銀金金銀 ×

7: 飛銀金金銀玉
  ×銀金金銀角×

8: 飛銀金金銀 玉
  ×銀金金銀角×

9: 飛銀金金銀銀玉
  ×銀金金 角×

10: 飛銀金金銀銀玉
  ×銀金 金角×

11: 飛銀金金 銀玉
  ×銀金銀金角×

12: 飛銀金 金銀玉
  ×銀金銀金角×

13: 飛銀金銀金銀玉
  ×銀金 金角×

14: 飛銀金銀金銀玉
  ×銀金金 角×

15: 飛銀金銀 銀玉
  ×銀金金金角×

16: 飛銀金銀角銀玉
  ×銀金金金 ×

17: 飛銀金銀角銀玉
  ×銀金金 金×

18: 飛銀金銀角銀玉
  ×銀金 金金×

19: 飛銀金銀 銀玉
  ×銀金角金金×

20: 飛銀金銀金銀玉
  ×銀金角 金×

21: 飛銀金 金銀玉
  ×銀金角銀金×

22: 飛銀 金金銀玉
  ×銀金角銀金×

23: 飛銀角金金銀玉
  ×銀金 銀金×

24: 飛銀角金金銀玉
  ×銀 金銀金×

25: 飛 角金金銀玉
  ×銀銀金銀金×

26: 飛銀角金金銀玉
  × 銀金銀金×

27: 飛銀 金金銀玉
  ×角銀金銀金×

28: 飛銀銀金金銀玉
  ×角 金銀金×

29: 飛 銀金金銀玉
  ×角銀金銀金×

30:  飛銀金金銀玉
  ×角銀金銀金×

31: 角飛銀金金銀玉
  × 銀金銀金×

32: 角飛 金金銀玉
  ×銀銀金銀金×

33: 角 飛金金銀玉
  ×銀銀金銀金×

34: 角銀飛金金銀玉
  ×銀 金銀金×

35: 角銀 金金銀玉
  ×銀飛金銀金×

36: 角銀金金金銀玉
  ×銀飛 銀金×

37: 角銀金金金銀玉
  ×銀 飛銀金×

38: 角銀 金金銀玉
  ×銀金飛銀金×

39: 角銀金 金銀玉
  ×銀金飛銀金×

40: 角銀金金 銀玉
  ×銀金飛銀金×

41: 角銀金金銀銀玉
  ×銀金飛 金×

42: 角銀金金銀銀玉
  ×銀金 飛金×

43: 角銀金金 銀玉
  ×銀金銀飛金×

44: 角銀金金飛銀玉
  ×銀金銀 金×

45: 角銀金金飛 玉
  ×銀金銀銀金×

46: 角銀金金 飛玉
  ×銀金銀銀金×

47: 角銀金金金飛玉
  ×銀金銀銀 ×

48: 角銀金金金飛
  ×銀金銀銀玉×

49: 角銀金金金 飛
  ×銀金銀銀玉×

50: 角銀金金 金飛
  ×銀金銀銀玉×

51: 角銀金金玉金飛
  ×銀金銀銀 ×

52: 角銀金金玉 飛
  ×銀金銀銀金×

53: 角銀金金玉銀飛
  ×銀金銀 金×

54: 角銀金金 銀飛
  ×銀金銀玉金×

55: 角銀金金銀銀飛
  ×銀金 玉金×

56: 角銀金金銀銀飛
  ×銀金玉 金×

57: 角銀金金銀銀飛
  ×銀金玉金 ×

58: 角銀金金 銀飛
  ×銀金玉金銀×

59: 角銀金 金銀飛
  ×銀金玉金銀×

 

Re: 将棋パズルの最少手数解は?

 投稿者:山中和義  投稿日:2013年 6月25日(火)11時22分9秒
  > No.3080[元記事へ]

GAIさんへのお返事です。

(貧欲法、欲張り法)
55手

飛車を右へ(最適解は22手)  25 手

  0: 飛銀金 金銀角
   ×銀金玉金銀×
  1: 飛銀 金金銀角
   ×銀金玉金銀×
  2: 飛銀銀金金銀角
   × 金玉金銀×
  3: 飛銀銀金金銀角
   ×金 玉金銀×
  4: 飛 銀金金銀角
   ×金銀玉金銀×
  5:  飛銀金金銀角
   ×金銀玉金銀×
  6: 金飛銀金金銀角
   × 銀玉金銀×
  7: 金 銀金金銀角
   ×飛銀玉金銀×
  8: 金銀銀金金銀角
   ×飛 玉金銀×
  9: 金銀銀金金銀角
   × 飛玉金銀×
 10: 金銀 金金銀角
   ×銀飛玉金銀×
 11: 金銀金 金銀角
   ×銀飛玉金銀×
 12: 金銀金玉金銀角
   ×銀飛 金銀×
 13: 金銀金玉金銀角
   ×銀 飛金銀×
 14: 金銀金 金銀角
   ×銀玉飛金銀×
 15: 金銀金金 銀角
   ×銀玉飛金銀×
 16: 金銀金金銀銀角
   ×銀玉飛金 ×
 17: 金銀金金銀銀角
   ×銀玉飛 金×
 18: 金銀金金銀銀角
   ×銀玉 飛金×
 19: 金銀金金 銀角
   ×銀玉銀飛金×
 20: 金銀金金飛銀角
   ×銀玉銀 金×
 21: 金銀金金飛 角
   ×銀玉銀銀金×
 22: 金銀金金 飛角
   ×銀玉銀銀金×
 23: 金銀金金金飛角
   ×銀玉銀銀 ×
 24: 金銀金金金飛
   ×銀玉銀銀角×
 25: 金銀金金金 飛
   ×銀玉銀銀角×


角を左へ  30 手

  1: 金銀金金金銀飛
   ×銀玉銀 角×
  2: 金銀金金 銀飛
   ×銀玉銀金角×
  3: 金銀金 金銀飛
   ×銀玉銀金角×
  4: 金銀金銀金銀飛
   ×銀玉 金角×
  5: 金銀金銀金銀飛
   ×銀玉金 角×
  6: 金銀金銀 銀飛
   ×銀玉金金角×
  7: 金銀金銀角銀飛
   ×銀玉金金 ×
  8: 金銀金銀角銀飛
   ×銀玉金 金×
  9: 金銀金 角銀飛
   ×銀玉金銀金×
 10: 金銀金金角銀飛
   ×銀玉 銀金×
 11: 金銀金金 銀飛
   ×銀玉角銀金×
 12: 金銀金金銀銀飛
   ×銀玉角 金×
 13: 金銀金金銀銀飛
   ×銀玉角金 ×
 14: 金銀金金 銀飛
   ×銀玉角金銀×
 15: 金銀金 金銀飛
   ×銀玉角金銀×
 16: 金銀 金金銀飛
   ×銀玉角金銀×
 17: 金銀角金金銀飛
   ×銀玉 金銀×
 18: 金銀角金金銀飛
   ×銀 玉金銀×
 19: 金 角金金銀飛
   ×銀銀玉金銀×
 20: 金銀角金金銀飛
   × 銀玉金銀×
 21: 金銀 金金銀飛
   ×角銀玉金銀×
 22: 金銀銀金金銀飛
   ×角 玉金銀×
 23: 金 銀金金銀飛
   ×角銀玉金銀×
 24:  金銀金金銀飛
   ×角銀玉金銀×
 25: 角金銀金金銀飛
   × 銀玉金銀×
 26: 角 銀金金銀飛
   ×金銀玉金銀×
 27: 角銀銀金金銀飛
   ×金 玉金銀×
 28: 角銀銀金金銀飛
   × 金玉金銀×
 29: 角銀 金金銀飛
   ×銀金玉金銀×
 30: 角銀金 金銀飛
   ×銀金玉金銀×

 

Re: 将棋パズルの最少手数解は?

 投稿者:GAI  投稿日:2013年 6月25日(火)13時45分44秒
  > No.3081[元記事へ]

山中和義さんへのお返事です。

> 55手
>
試行錯誤での挑戦ですか?
私も将棋の駒を動かしながらやっていますが、なかなか手数が縮まらなくて苦戦しています。
51手まであと-4手ですね。
 
 

Re: 将棋パズルの最少手数解は?

 投稿者:山中和義  投稿日:2013年 6月26日(水)06時55分48秒
  > No.3082[元記事へ]

GAIさんへのお返事です。

> 試行錯誤での挑戦ですか?

次の流れになるもので検索すると、プログラムで2分程度で見つかりました。

飛車を右へ
  0: 飛銀金 金銀角
   ×銀金玉金銀×

  ↓

 xx: 金銀○○○ 飛
   ×銀○○銀角×

角を左へ

  ↓

 39: 金銀角金金銀飛
   ×銀 玉金銀×
 39: 金銀角玉金銀飛
   ×銀 金金銀×

  ↓ 12手

 51: 角銀金 金銀飛
   ×銀金玉金銀×


52 手
飛車を右へ

  0: 飛銀金 金銀角
   ×銀金玉金銀×
  1: 飛銀 金金銀角
   ×銀金玉金銀×
  2: 飛銀銀金金銀角
   × 金玉金銀×
  3: 飛銀銀金金銀角
   ×金 玉金銀×
  4: 飛 銀金金銀角
   ×金銀玉金銀×
  5:  飛銀金金銀角
   ×金銀玉金銀×
  6: 金飛銀金金銀角
   × 銀玉金銀×
  7: 金飛 金金銀角
   ×銀銀玉金銀×
  8: 金 飛金金銀角
   ×銀銀玉金銀×
  9: 金銀飛金金銀角
   ×銀 玉金銀×
 10: 金銀飛金金銀角
   ×銀玉 金銀×
 11: 金銀飛 金銀角
   ×銀玉金金銀×
 12: 金銀 飛金銀角
   ×銀玉金金銀×
 13: 金銀金飛金銀角
   ×銀玉 金銀×
 14: 金銀金飛金銀角
   ×銀玉金 銀×
 15: 金銀金飛金 角
   ×銀玉金銀銀×
 16: 金銀金飛 金角
   ×銀玉金銀銀×
 17: 金銀金 飛金角
   ×銀玉金銀銀×
 18: 金銀金銀飛金角
   ×銀玉金 銀×
 19: 金銀金銀 金角
   ×銀玉金飛銀×
 20: 金銀金銀金 角
   ×銀玉金飛銀×
 21: 金銀金銀金銀角
   ×銀玉金飛 ×
 22: 金銀金銀金銀角
   ×銀玉金 飛×
 23: 金銀金銀金 角
   ×銀玉金銀飛×
 24: 金銀金銀金飛角
   ×銀玉金銀 ×
 25: 金銀金銀金飛
   ×銀玉金銀角×
 26: 金銀金銀金 飛 ←←←
   ×銀玉金銀角×

角を左へ

 27: 金銀金銀 金飛
   ×銀玉金銀角×
 28: 金銀金銀角金飛
   ×銀玉金銀 ×
 29: 金銀金銀角 飛
   ×銀玉金銀金×
 30: 金銀金銀角銀飛
   ×銀玉金 金×
 31: 金銀金 角銀飛
   ×銀玉金銀金×
 32: 金銀金金角銀飛
   ×銀玉 銀金×
 33: 金銀金金 銀飛
   ×銀玉角銀金×
 34: 金銀金金銀銀飛
   ×銀玉角 金×
 35: 金銀金金銀銀飛
   ×銀玉角金 ×
 36: 金銀金金 銀飛
   ×銀玉角金銀×
 37: 金銀金 金銀飛
   ×銀玉角金銀×
 38: 金銀 金金銀飛
   ×銀玉角金銀×
 39: 金銀角金金銀飛
   ×銀玉 金銀×
 40: 金銀角金金銀飛 ←←←
   ×銀 玉金銀×
 41: 金 角金金銀飛
   ×銀銀玉金銀×
 42: 金銀角金金銀飛
   × 銀玉金銀×
 43: 金銀 金金銀飛
   ×角銀玉金銀×
 44: 金銀銀金金銀飛
   ×角 玉金銀×
 45: 金 銀金金銀飛
   ×角銀玉金銀×
 46:  金銀金金銀飛
   ×角銀玉金銀×
 47: 角金銀金金銀飛
   × 銀玉金銀×
 48: 角 銀金金銀飛
   ×金銀玉金銀×
 49: 角銀銀金金銀飛
   ×金 玉金銀×
 50: 角銀銀金金銀飛
   × 金玉金銀×
 51: 角銀 金金銀飛 ←←←
   ×銀金玉金銀×
 52: 角銀金 金銀飛
   ×銀金玉金銀×


あと1手!!!
 

Re: 将棋パズルの最少手数解は?

 投稿者:GAI  投稿日:2013年 6月27日(木)06時50分49秒
  > No.3083[元記事へ]

山中和義さんへのお返事です。

>
> あと1手!!!
>

この手数を更に減らすことは不可能だと思います。
何度挑戦しても、この作戦以外駒を動かす有効な効率のいい手は有り得ません。
ここは、出題者が最終局面を51手にて達成できたと勘違いして解釈したとしか思えません。
手の数と局面を混同して判断した。
ただ角から移動することは一度も検討してはいないが・・・
 

Re: 将棋パズルの最少手数解は?

 投稿者:山中和義  投稿日:2013年 6月27日(木)10時08分54秒
  > No.3084[元記事へ]

GAIさんへのお返事です。

> この手数を更に減らすことは不可能だと思います。

いろいろやってみました。確かに52手が最少です。


> ただ角から移動することは一度も検討してはいないが・・・

同様な流れ(決り手)になるもので検索すると、5分程度で見つかりました。

角を左へ
  0: 飛銀金 金銀角
   ×銀金玉金銀×

  ↓

 xx: 角飛銀金玉銀金
   × 銀金銀金×

飛車を右へ

  ↓

 40: 角銀金金飛銀金
   ×銀金玉 銀×
 40: 角銀金玉飛銀金
   ×銀金金 銀×

  ↓ 11手

 51: 角銀金 金銀飛
   ×銀金玉金銀×


51 手
角を左へ

  0: 飛銀金 金銀角
   ×銀金玉金銀×
  1: 飛銀金玉金銀角
   ×銀金 金銀×
  2: 飛銀金玉金銀角
   ×銀金金 銀×
  3: 飛銀金玉金 角
   ×銀金金銀銀×
  4: 飛銀金玉 金角
   ×銀金金銀銀×
  5: 飛銀金玉銀金角
   ×銀金金銀 ×
  6: 飛銀金玉銀金
   ×銀金金銀角×
  7: 飛銀金玉銀 金
   ×銀金金銀角×
  8: 飛銀金玉銀銀金
   ×銀金金 角×
  9: 飛銀金玉銀銀金
   ×銀金 金角×
 10: 飛銀金玉 銀金
   ×銀金銀金角×
 11: 飛銀金玉角銀金
   ×銀金銀金 ×
 12: 飛銀金玉角銀金
   ×銀金銀 金×
 13: 飛銀金 角銀金
   ×銀金銀玉金×
 14: 飛銀金銀角銀金
   ×銀金 玉金×
 15: 飛銀金銀 銀金
   ×銀金角玉金×
 16: 飛銀金銀玉銀金
   ×銀金角 金×
 17: 飛銀金 玉銀金
   ×銀金角銀金×
 18: 飛銀 金玉銀金
   ×銀金角銀金×
 19: 飛銀角金玉銀金
   ×銀金 銀金×
 20: 飛銀角金玉銀金
   ×銀 金銀金×
 21: 飛 角金玉銀金
   ×銀銀金銀金×
 22: 飛銀角金玉銀金
   × 銀金銀金×
 23: 飛銀 金玉銀金
   ×角銀金銀金×
 24: 飛銀銀金玉銀金
   ×角 金銀金×
 25: 飛 銀金玉銀金
   ×角銀金銀金×
 26:  飛銀金玉銀金
   ×角銀金銀金×
 27: 角飛銀金玉銀金 ←←←
   × 銀金銀金×

飛車を右へ

 28: 角飛 金玉銀金
   ×銀銀金銀金×
 29: 角 飛金玉銀金
   ×銀銀金銀金×
 30: 角銀飛金玉銀金
   ×銀 金銀金×
 31: 角銀飛金玉銀金
   ×銀金 銀金×
 32: 角銀飛 玉銀金
   ×銀金金銀金×
 33: 角銀 飛玉銀金
   ×銀金金銀金×
 34: 角銀金飛玉銀金
   ×銀金 銀金×
 35: 角銀金飛 銀金
   ×銀金玉銀金×
 36: 角銀金飛銀銀金
   ×銀金玉 金×
 37: 角銀金飛銀銀金
   ×銀金玉金 ×
 38: 角銀金飛 銀金
   ×銀金玉金銀×
 39: 角銀金 飛銀金
   ×銀金玉金銀×
 40: 角銀金金飛銀金 ←←←
   ×銀金玉 銀×
 41: 角銀金金飛 金
   ×銀金玉銀銀×
 42: 角銀金金飛金
   ×銀金玉銀銀×
 43: 角銀金金飛金銀
   ×銀金玉銀 ×
 44: 角銀金金飛 銀
   ×銀金玉銀金×
 45: 角銀金金 飛銀
   ×銀金玉銀金×
 46: 角銀金金金飛銀
   ×銀金玉銀 ×
 47: 角銀金金金飛
   ×銀金玉銀銀×
 48: 角銀金金金 飛
   ×銀金玉銀銀×
 49: 角銀金金金銀飛
   ×銀金玉 銀×
 50: 角銀金金 銀飛
   ×銀金玉金銀×
 51: 角銀金 金銀飛
   ×銀金玉金銀×


上記の流れを見つける専用(枝刈りの部分)のプログラムです。
前出の飛車を移動させて、その後角を移動させる場合も同じようなものになります。

!パズル - 将棋駒の入れ替え

!7×2 飛車と角を入れ替える
! 飛銀金 金銀角 → 角銀金 金銀飛
! ×銀金玉金銀×   ×銀金玉金銀×
!答え 51手

LET t0=TIME

PUBLIC NUMERIC xSIZE,ySIZE !盤の大きさ
LET xSIZE=7
LET ySIZE=2

DECLARE STRING INIT$ !初期の状態
LET INIT$="飛銀金 金銀角×銀金玉金銀×"

PUBLIC STRING GOAL$ !完成の状態
LET GOAL$="角銀金 金銀飛×銀金玉金銀×"

PUBLIC NUMERIC LIM !手数の上限 →最少手数
LET LIM=52

!---------- ↓↓↓↓↓ ---------- 盤面の正当性を確認する
IF LEN(INIT$)<>ySIZE*xSIZE THEN
   PRINT "盤の大きさ(xSIZE,ySIZE)と駒の数(INIT$)が合いません。"
   STOP
END IF
IF LEN(GOAL$)<>ySIZE*xSIZE THEN
   PRINT "盤の大きさ(xSIZE,ySIZE)と駒の数(GOAL$)が合いません。"
   STOP
END IF

FOR p=1 TO ySIZE*xSIZE !盤を走査して空白を見つける
   IF INIT$(p:p)=" " THEN EXIT FOR
NEXT p
IF p>ySIZE*xSIZE THEN
   PRINT "空白がありません。"
   STOP
END IF
!---------- ↑↑↑↑↑ ----------

PUBLIC STRING KO$(5) !駒の種類と移動可能範囲 ※8近傍 動きは将棋と同じ
!DATA "×○××歩××××"
DATA "○○○×銀×○×○"
DATA "○○○○金○×○×"
DATA "○○○○玉○○○○"
DATA "×○×○飛○×○×"
DATA "○×○×角×○×○"
FOR i=1 TO UBOUND(KO$)
   READ KO$(i)
NEXT i

PUBLIC STRING STK$(0 TO 200) !局面の記録 ※スタック
FOR i=0 TO 200
   LET STK$(i)=""
NEXT i

PUBLIC NUMERIC C !解の個数
LET C=0
LET STK$(0)=INIT$
CALL backtrack(1,p) !1手目
IF C=0 THEN PRINT "解なし"

PRINT "計算時間=";TIME-t0;"秒"

END


EXTERNAL SUB backtrack(L,p) !1手ずつ打っていき、行き詰まれば元に戻ってやり直す
LET bd$=stk$(L-1) !現在の局面

!---------- ↓↓↓↓↓ ---------- 枝刈り
IF L<=30 THEN !飛車の移動
   FOR i=1 TO ySIZE*xSIZE !誘導
      IF bd$(i:i)="角" THEN EXIT FOR
   NEXT i
   IF L>15 AND (i=13 OR i=7) THEN EXIT SUB
   IF L>20 AND (i=5 OR i=13 OR i=7) THEN EXIT SUB
   IF L>24 AND NOT(i=1 OR i=9 OR i=3 OR i=11) THEN EXIT SUB
   IF L>27 AND NOT(i=1 OR i=9) THEN EXIT SUB

   IF bd$(9:9)="角" AND bd$(1:1)="銀" THEN EXIT SUB !禁じ手

   IF bd$(1:1)="角" THEN !決り手
      PRINT L
      IF NOT(bd$(6:7)="銀金" AND bd$(13:13)="金") THEN EXIT SUB !決り手
   END IF
ELSE !角の移動
   IF NOT(bd$(1:1)="角") THEN EXIT SUB

   FOR i=1 TO ySIZE*xSIZE !誘導
      IF bd$(i:i)="飛" THEN EXIT FOR
   NEXT i
   IF L>35 AND (i=1 OR i=2 OR i=9 OR i=3 OR i=10) THEN EXIT SUB

   IF L>40 AND NOT(bd$(2:3)="銀金" AND bd$(9:10)="銀金") THEN EXIT SUB !決り手

   IF bd$(6:6)="飛" AND bd$(7:7)="金" THEN EXIT SUB !禁じ手
END IF
!---------- ↑↑↑↑↑ ----------

LET px=MOD(p-1,xSIZE)+1 !水平・垂直の座標へ
LET py=INT((p-1)/xSIZE)+1

FOR d=1 TO 9 !隣接する駒を探す
   IF d=5 THEN
   ELSE
      LET mx=px + MOD(d-1,3)-1 !移動元の座標 ※dを水平・垂直の差分dx,dyへ
      LET my=py + INT((d-1)/3)-1
      IF (mx>=1 AND mx<=xSIZE) AND (my>=1 AND my<=ySIZE) THEN !盤内か確認する

         LET mp=(my-1)*xSIZE + mx !連番へ
         LET t$=bd$(mp:mp)
         IF t$="×" OR t$=" " THEN
         ELSE

            FOR a=1 TO UBOUND(KO$) !駒の属性を得る
               IF t$=KO$(a)(5:5) THEN EXIT FOR
            NEXT a
            IF KO$(a)(10-d:10-d)="×" THEN !移動可能範囲なら
            ELSE

               LET w$=bd$
               LET w$(p:p)=t$ !移動させる
               LET w$(mp:mp)=" "

               IF w$=GOAL$ THEN !完成なら、手順を記録しておく
                  LET C=C+1
                  PRINT L;"手"
                  FOR i=0 TO L-1
                     PRINT STR$(i);": ";STK$(i)
                  NEXT i
                  PRINT STR$(L);": ";w$

                  LET LIM=L !上限を狭める
               ELSE
                  FOR t=L TO 0 STEP -1 !最近の局面から順に新しい手かどうか確認する
                     IF STK$(t)=w$ THEN EXIT FOR
                  NEXT t
                  IF t<0 THEN
                     LET STK$(L)=w$ !記録して、次の局面へ
                     IF L<LIM THEN CALL backtrack(L+1,mp) !上限まで
                  END IF
               END IF

            END IF

         END IF

      END IF
   END IF
NEXT d
END SUB

 

Re: 将棋パズルの最少手数解は?

 投稿者:GAI  投稿日:2013年 6月28日(金)08時38分33秒
  > No.3085[元記事へ]

山中和義さんへのお返事です。

やはり正解は51手が可能なんですね。
(飛車から移動しようとすると52手が最少にしかならない!)
この初期画面から100人に挑戦させたとすると、70~80パーセントの人は
直線的に動く飛車から移動させようとするのではと思われます。
また右から左方向より、左から右方向が人間にとって自然な移動方向と感じる習慣があるのではないかと思われます。(このことも狙ってあえて初期画面を飛車と角行の位置を入れ替えたものからスタートさせるものに設定しているとも訝れるところです。)
いずれにしても、このパズルは思いのほか奥が深いものになっている。
この正解を入手するには、やはりコンピュータによる検索がかかせません。
この検索を可能とするプログラムが考えられることも私にとっては驚きです。
本来の将棋の力は上達しませんでしたが、大ゴマを取られないように逃げ回る技術は向上したと思われます。
 

戻る