日期:2014-05-19  浏览次数:20858 次

急求一个算法
有7个格,中间空,左放三白棋,右放三黑.最终把三黑的移到左边,白的移到右.
规则:(1)一次只移一个棋;(2)棋可向空格移,也可跳过一个对方的棋进入空格,但不
可跳过两个棋子.

------解决方案--------------------
白棋分W1,W2,W3三颗棋子,黑棋分B1,B2,B3三个棋子。
棋盘格子分为 G1,G2,G3,G4,G5,G6,G7。
白棋W1位于G1,W2位于G2,W3位于G3,黑棋B1位于G5,B2位于G6,B3位于G7.
G1,G2,G3,G5,G6,G7在棋盘中逆时钟排列,G4位于棋盘中央。

此只考虑所有棋只能通过中间空位移动或跳过的情况
第一步:W1-> G4,W2-> G1点(原W1的位置,W2位G2空闲),G6点B2通过W1跳到G2点。
第二步:位于G4点的W1-> G6,W2-> G4(将在G1的W2移到G4),在G5点的B1通过W2跳到G1点。
第三步:位于G4点的W2-> G5,W3-> G4,在G7点的B3通过W3跳到G3点。
第四步:W3-> G7,G4(中间位空出)
------解决方案--------------------
此问题可以转化成:输入数组{1,1,1,0,2,2,2},输出数组{2,2,2,0,1,1,1}
移动规则:
1、与0相邻的任何数可以与0交换位置
2、与0不相邻、且中间只间隔一位、间隔的数字又与其不相同的数也可以与0交换位置。如:012可以交换成210,就是跳棋中的跳的意思。
具体解法:1、将最右边的1移动到所有2的右侧 2、其他1的移动可以利用递归。
------解决方案--------------------
w1 w2 w3 b1 b2 b3
````````````````````````
1 2 3 4 5 6 7
对应关系
w1 w2 w3 b1 b2 b3 w1 w2 b1 w3 b2 b3 w1 b1 w2 w3 b2 b3 w1 b1 w2 b2 w3b3
````````````````````--> ````````````````````--> ````````````````````-> ````````````````
1 2 3 4 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5 6 7
w1 b1 w2 b2 b3 w3 w1 b1 b2 w2 b3 w3 b1 b2 w1 w2 b3 w3 b1 b2 w1 b3 w2 w3
``````````````````--> ```````````````````-> ``````````````````-> ````````````````````->
1 2 3 4 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5 6 7
b1 b2 b3 w1 w2 w3
``````````````````
1 2 3 4 5 6 7
不知道这样达到lz的目的没???