有三个白子和三个黑子如下图布置:○ ○ ○ ● ● ●用最少的步数将上图中白子和黑子的位置进行交换:● ● ● ○ ○ ○规则是:(1)一次只能移动一个棋子; (2)棋子可以向空格中移

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/02 18:04:28
有三个白子和三个黑子如下图布置:○ ○ ○ ● ● ●用最少的步数将上图中白子和黑子的位置进行交换:● ● ● ○ ○ ○规则是:(1)一次只能移动一个棋子; (2)棋子可以向空格中移

有三个白子和三个黑子如下图布置:○ ○ ○ ● ● ●用最少的步数将上图中白子和黑子的位置进行交换:● ● ● ○ ○ ○规则是:(1)一次只能移动一个棋子; (2)棋子可以向空格中移
有三个白子和三个黑子如下图布置:
○ ○ ○ ● ● ●
用最少的步数将上图中白子和黑子的位置进行交换:
● ● ● ○ ○ ○
规则是:
(1)一次只能移动一个棋子;
(2)棋子可以向空格中移动,也可以跳过一个对方的棋子进入空格,但不能向后跳,也不能跳过两个子.
(本题共60分,要求1占30分,要求2占30分)
要求:
(1)分析问题,找出规律,总结出规则和算法,并描述你的算法设计思想.
(2)编程显示每一步交换过程.
白子和黑子之间有一个空位的,没有显示出来,不好意思啊

有三个白子和三个黑子如下图布置:○ ○ ○ ● ● ●用最少的步数将上图中白子和黑子的位置进行交换:● ● ● ○ ○ ○规则是:(1)一次只能移动一个棋子; (2)棋子可以向空格中移
/**
* 黑白棋程序入口
*
* @author skr
*
*/
public class HeiBaiQi {
public static void main(String[] args) {
new Run().run();
}
}
/**
* 棋子类,基类
*
* @author skr
*
*/
abstract class QiZi {
/**
* 棋子编号
*/
public int number;
/**
* 棋子所在位置
*/
public int index;
public abstract boolean move(StringBuilder chessboard);
}
/**
* 黑子类继承棋子类
*
* @author skr
*
*/
class HeiZi extends QiZi {
public HeiZi(int num) {
number = num;
}
/**
* 黑子移动方法
*/
public boolean move(StringBuilder chessboard) {
boolean flag = true;
int sIndex = chessboard.indexOf("s");
if (sIndex == index - 1 || sIndex == index - 2) {
chessboard.setCharAt(index, 's');
chessboard.setCharAt(sIndex, 'b');
index = sIndex;
} else
flag = false;
if (chessboard.toString().equals(Run.chessboardEnd))
Run.flag = true;
String strFlag = flag ? "成功" : "失败";
System.out.println("尝试路径:" + Run.routeStr + number + "\t" + chessboard
+ "\t" + strFlag);
return flag;
}
}
/**
* 白子类继承棋子类
*
* @author skr
*
*/
class BaiZi extends QiZi {
public BaiZi(int num) {
number = num;
}
/**
* 白子移动方法
*/
public boolean move(StringBuilder chessboard) {
boolean flag = true;
int sIndex = chessboard.indexOf("s");
if (sIndex == index + 1 || sIndex == index + 2) {
chessboard.setCharAt(index, 's');
chessboard.setCharAt(sIndex, 'w');
index = sIndex;
} else
flag = false;
if (chessboard.toString().equals(Run.chessboardEnd))
Run.flag = true;
String strFlag = flag ? "成功" : "失败";
System.out.println("尝试路径:" + Run.routeStr + number + "\t" + chessboard
+ "\t" + strFlag);
return flag;
}
}
class Run {
/**
* 标志是否找到了最佳路径
*/
public static boolean flag = false;
/**
* 最佳路径字符串
*/
public static StringBuilder routeStr = new StringBuilder();
/**
* 完成时棋盘字符串
*/
public static final String chessboardEnd = "bbbswww";
/**
* 棋盘字符串 b:黑子,s:空格,w:白子
*/
public StringBuilder chessboard = new StringBuilder("wwwsbbb");
/**
* 棋子数组
*/
public QiZi[] qizi = new QiZi[6];
public Run() {
qizi[0] = new BaiZi(0);
qizi[1] = new BaiZi(1);
qizi[2] = new BaiZi(2);
qizi[3] = new HeiZi(3);
qizi[4] = new HeiZi(4);
qizi[5] = new HeiZi(5);
qizi[0].index = 0;
qizi[1].index = 1;
qizi[2].index = 2;
qizi[3].index = 4;
qizi[4].index = 5;
qizi[5].index = 6;
}
/**
* 运行程序,从0步走完开始测试
*/
public void run() {
testRoute();
System.out.println("最佳路径为:" + routeStr);
}
public void testRoute() {
for (int i = 0; i < qizi.length; i++) {
if (flag)
break;
StringBuilder temp = new StringBuilder(chessboard);
int indexTemp = qizi[i].index;
boolean b = qizi[i].move(chessboard);
if (!b)
continue;
if (routeStr.length() != 0
&& i == Integer.parseInt(routeStr.substring(routeStr
.length() - 1)))
continue;
routeStr.append(i);
testRoute();
if (flag)
return;
chessboard = temp;// 还原棋盘
routeStr.deleteCharAt(routeStr.length() - 1);// 还原路径
qizi[i].index = indexTemp;// 还原棋子位置
}
}
}
[楼主,第一版效率较低,我也没时间来考虑优化,仅提供给楼主参考,运行一下几个小时估计可以枚举出结果,楼主可以适当的自己做些优化,比如跳过一些肯定不肯能的情况,可以少很多次迭代,仅供参考,望楼主顺利解决问题 ( 修改了一下,刚才那版有内存溢出的问题)]
经过修改,这个程序效率已经比较高了,上面是我最新修改的,楼主可以拿去试试了
结果(截取):
尝试路径:23421034521040 bbswbww 失败
尝试路径:23421034521041 bbswbww 失败
尝试路径:23421034521042 bbswbww 失败
尝试路径:23421034521043 bbswbww 失败
尝试路径:23421034521044 bbswbww 失败
尝试路径:23421034521045 bbbwsww 成功
尝试路径:234210345210450 bbbswww 成功
最佳路径为:234210345210450

有三个白子和三个黑子如下图布置:○ ○ ○ ● ● ●用最少的步数将上图中白子和黑子的位置进行交换:● ● ● ○ ○ ○规则是:(1)一次只能移动一个棋子; (2)棋子可以向空格中移 一个盒子里装有10个白子和10个黑子,至少要从中摸出几个棋子才能保证有三个棋子是相同颜色的 有黑白棋子个一堆,黑子的个数是白字个数的2倍现在从这堆棋子每次取出黑子4个白子三个待到若干次后,白子已取尽黑子还有16个,白子黑子各有几个? 有一堆棋子黑子是白子的三分之二.现在取出12粒黑子,添上18粒白子后,黑子的粒数是白子的5/12.问白子和黑子各有多少粒? 两堆棋子,A有黑子210白子300.B黑子240白子60,要使A黑子占50%,B黑子占75%,要从B拿多少黑子和白子到A 有三个盒子分别在里面装着黑、白两种颜色的棋子,并且三个盒子的棋子总数相等.已知第一个盒里的白子与第二个盒里的黑子同样多,第三个盒里的白子是所有白子总数的2/5,则这三个盒子里的 有两堆棋子,A堆有白子500个和黑子350个,B堆有白子100个黑子400个.为了使A堆中的黑子占50%.有两堆棋子,A堆有白子500个和黑子350个,B堆有白子100个黑子400个.为了使A堆中的黑子占50%,B堆中黑子占 有两堆棋子,A堆有白子500个和黑子350个,B堆有白子100个黑子400个.为了使A堆中的黑子占50%.有两堆棋子,A堆有白子500个和黑子350个,B堆有白子100个黑子400个.为了使A堆中的黑子占50%,B堆中黑子占 三盒黑白棋中棋子总数相等,已知第一个盒子中黑子的数量和第二个盒子中白子的数量相等,第三个盒子中黑子的数量是全部黑子数量的2/5,那么白子总数与全部棋子数量比是多少 有一堆棋子,黑子的颗数是白子的2倍,从这堆棋子中每次取出5颗黑子和4颗白子.取多少次后白子取尽,而黑子还剩21颗?请列方程解决问题. 有一堆棋子,黑子的颗数是白子的2倍,从这堆棋子中每次取出5颗黑子和4颗白子.取多少次后白子取尽,黑子还剩21颗? 有两堆棋子,A堆有白子500个和黑子350个,B堆有白子100个黑子400个.为了使A堆中的黑子占50%,B堆中黑子算式方法 有三堆围棋子,每堆60个,第一堆的黑子和第二堆白子一样多.第三堆有1/3白子.问三堆共有白子多少枚? 甲、乙两堆棋子中都有白子和黑子.甲堆中白子与黑子的颗数比是2:1,乙堆中白子与黑子的颗数比是4:7.如果从乙堆拿出3颗黑子放入甲堆,则甲堆中白子与黑子的颗数比是7:4;如果把两堆棋子合在 有堆棋子,a堆棋子有500个白子和350个黑子,b堆有白子100个和黑子400个,为了a堆白子占50%,B堆白子占25%黑子白子各取多少个? 有一堆围棋子,黑子数是白子数的三分之二,现在取走12粒黑子,添上18粒白子后,黑子数是白子的十二分之五.现在白子和黑子各有多少粒?有思考过程,最好用方程, 有2道题目,是希望教育的.有甲.乙2堆围棋子,甲堆中黑子和白子数的比是7:4,乙堆中黑子与白子数的比是7:6,如果从甲堆中取出15颗黑子及白子放入乙堆中,则乙堆中白子与黑子的比是4:5,甲堆中白 有一堆围棋子,黑子是白子的三分之二,现在取走12粒黑子,添上18粒白子后,黑子是白子的十二分之五问:现在白子和黑子各有多少粒?最好在八点之前发过来,我认为正确了我提高悬赏!