我已经进行了一个星期的算法研究,我成功地制作了一种算法来创建捕获对手棋子的路径,然后在8x8板上找到最大捕获路径。
var moves = [[37 , 69] , [69 , 101] , [ 101 , 99] , [69 ,71], [ 69 , 67] , [67 , 99] , [99 , 101] , [71 ,103] ]
注意:无法分别捕捉到黑色。
这里我不知道终点,所以这就是为什么我可以使用搜索算法(例如BFS,DFS等)的原因
所以我决定首先找到所有可能的捕获,这些捕获现在已添加到硬编码的moves数组中。
然后创建了创建路径的算法,但是算法的复杂性要高得多,但是我需要更好的算法才能完成同样的工作。
这是我的算法
var getPaths = GetPaths(moves);
function GetPaths(moves) {
var paths = [];
for (var x = 0 ; x < moves.length ; x++) {
var path = [];
for (var y = x + 1 ; y < moves.length ; y++) {
if (moves[x][1] == moves[y][0]) {
if (!(path.includes(moves[x]))) {
path.push(moves[x]);
}
var data = [moves[y][0], moves[y][1]];
path.push(data);
}
}
if (path.length > 0) paths.push(path);
}
var newpaths = [];
var nextRow = paths[0];
var len = paths.length;
for (var h = 1 ; h < nextRow.length; h++) {
for (var j = 1 ; j < len ; j++) {
var newpath = [];
if (isInArray(nextRow[h], paths[j][0])) {
newpath.push(nextRow[0]);
var nextfound = false;
for (var k = j + 1 ; k < paths.length ; k++) {
if (isInArray(paths[j][paths[j].length - 1], paths[k][0])) {
newpath.push(paths[j][0]);
if (paths[k][0][0] - paths[k][0][1] != -(paths[k][1][0] - paths[k][1][1])) {
newpath.push(paths[k]);
} else {
newpath.push(paths[k][0]);
}
nextfound = true;
}
}
if (!nextfound) {
newpath.push(paths[j]);
}
}
if (newpath.length > 0) {
newpaths.push(newpath);
}
}
}
return newpaths;
}
var maxPath = FindMaximumCapture(getPaths);
function FindMaximumCapture(totalPaths) {
var max = totalPaths[0].toString().length;
var index = 0;
for (var count = 1 ; count < totalPaths.length ; count++) {
if (max < totalPaths[count].toString().length) {
max = totalPaths[count].toString().length;
index = count;
}
}
return totalPaths[index];
}
function isInArray(value, array) {
return array.indexOf(value[0]) > -1 && array.indexOf(value[1]) > -1;
}
这是JSFiddle中的代码链接