3^9 的假设是错误的。例如,这将包括一个只有 X 的棋盘,这是不可能的,因为两个玩家每轮都放置一个 X 或一个 O。
我最初的想法是有 (9*8*7*6*5*4*3*2) * 2 种可能性。第一个玩家有 9 个选择,第二个玩家有 8 个选择,第一个玩家有 7 个等等。我放 * 2 因为你可能有不同的最佳动作,具体取决于谁开始。
现在 3^9 是 19863 和 9!是 362880,所以显然这不是更好的解决方案,许多“不同的场景”实际上最终看起来完全一样。尽管如此,许多 19863 板设置无效的基本想法仍然存在。
这段代码可能可以用一个简单的公式代替,它告诉我这是你想要移动的位置数。
<script>
a = permuteString( "X........" ); document.write( Object.keys(a).length + "<br>" );console.log( a );
a = permuteString( "XO......." ); document.write( Object.keys(a).length + "<br>" );console.log( a );
a = permuteString( "XOX......" ); document.write( Object.keys(a).length + "<br>" );console.log( a );
a = permuteString( "XOXO....." ); document.write( Object.keys(a).length + "<br>" );console.log( a );
a = permuteString( "XOXOX...." ); document.write( Object.keys(a).length + "<br>" );console.log( a );
a = permuteString( "XOXOXO..." ); document.write( Object.keys(a).length + "<br>" );console.log( a );
a = permuteString( "XOXOXOX.." ); document.write( Object.keys(a).length + "<br>" );console.log( a );
//Subset of the Array.prototype.slice() functionality for a string
function spliceString( s , i )
{
var a = s.split("");
a.splice( i , 1 );
return a.join("");
}
//Permute the possibilities, throw away equivalencies
function permuteString( s )
{
//Holds result
var result = {};
//Sanity
if( s.length < 2 ) return [];
//The atomic case, if AB is given return { AB : true , BA : true }
if( s.length == 2 )
{
result[s] = true;
result[s.charAt(1)+s.charAt(0)] = true;
return result;
}
//Enumerate
for( var head = 0 ; head < s.length ; head++ )
{
var o = permuteString( spliceString( s , head ) );
for ( key in o )
result[ s.charAt( head ) + key ] = true;
}
return result;
}
</script>
这给出了以下数字: 第 1 步:9 第 2 步:72 第 3 步:252 第 4 步:756 第 5 步:1260 第 6 步:1680 第 7 步:1260
所以总共 5289 步,这甚至没有检查已经完成的游戏或对称性。
这些数字允许您通过数组查找移动,您可以通过循环所有可能的游戏来自己生成这个数组。
T。