2012-04-02 9 views
1

4つの色付きのキューブがあります。青色(B)、赤色(R)、緑色(G)、黄色(Y)の4つの色があり、それぞれの正面、背面、左、右、上、底部は、キューブの色は次のとおりa javascriptを使用したスタックキューブについてのインタビューの質問

enter image description here

目的は、カラムの各側は、すべての4つの色を示しているように、垂直列の4つのキューブを積層する方法を見つけることです。私は何ができるか

おかげ

PS:

function init(){ 
    var a = [['R','B'],['G','Y'],['B','Y']], 
     b = [['R','G'],['G','Y'],['B','B']], 
     c = [['Y','B'],['R','G'],['Y','R']], 
     d = [['Y','G'],['B','R'],['R','R']] 
    var box = [a,b,c,d] 
    return box; 
} 
+0

zjm1126:ああ、それは再びこの問題だ、それは多くのより明確な;-)私はこれを正しく理解している場合、 '4 * 3 * 2 *がある、他の場所からupvote – ninjagecko

+0

コピーを持っている;-) – zjm1126

答えて

0

検索可能なすべての状態:(キューブあたり24の回転、あなたはフィルタリングすることができますほとんどが、多くはありませんでる)。擬似コード:

for cubeLevel0 in rotations(cubes[0]): 
    var sidesMatch = function(cube) { 
     return cube.N==cubeLevel0.N and cube.S==cubeLevel0.S and ... 
    } 
    for cubeLevel1 in rotations(cube[1]).filter(sidesMatch): 
     for cubeLevel2 in rotations(cube[2]).filter(sidesMatch): 
      for cubeLevel3 in rotations(cube[3]).filter(sidesMatch): 
       console.log(cubeLevel0, cubeLevel1, cubeLevel2, cubeLevel3) 

は、forループのネストされたが、醜い、とあなたは再帰関数としてこれを実装することで、それらを削除することができます。わかりやすくするために、私はこの方法をとった。

rotations(cube)関数を実装するには、いくつかのオプションがあります。最も複雑なやり方は、あなたの正面にある物理的立方体を取って、各側に何らかの順序で{0,1,2,3,4,5}というラベルを付けることです。その後、24回転のうちの1つを物理的に実行し、並べ替えられた順番を書き留めてから、回転を元に戻します。そして、のようなので、関数を書く:

// You HAVE to manually discover these with the physical method described above 
var rotationPermutations = [[0,1,2,3,4,5,6], [3,4,2,1,5,0], ...(24 of these)...]; 

function rotations(cube) { // representing a cube as a 6-tuple 
    return rotationPermutations.map(function(permutation) { 
     // return [cube[i] for i in permutation] 
     return permutation.map(function(x){return cube[x]}) 
    });  
} 

あなたは順列が無効である場合に検出する方法を考え出すことができる場合は、物事について賢くなることができます。軸の3つの軸を2方向に並べることで、2^3 = 8個のフリップの可能性があり、3!* 2^3 = 48)、48軸のすべての順列を生成することができます([[axis0top, axis0bottom], [axis1top, axis1bottom], [axis2top, axis2bottom]]の表現を使用して軸3!間違ったキラリティーでそれらの半分を除外します。しかし、これについて考えると、上記の手動の方法を使って順列を書き留めるよりも時間がかかります。

+0

ています1 = 24 'の可能性がある。キューブを回転させる6つの方法があるので、結果として「144」の可能性が生じます。いくつかのバリエーションは重複していますが、重要ではありません...あなたが正しいです、この数字はjsのパフォーマンスに何の問題もありません。 –

+0

@ Chips_100:私を訂正してくれてありがとう、それは確かに24であり、6つのトップフェイスの選択のそれぞれについて12:4の選択肢ではありません。 – ninjagecko

0
Array.prototype.in_array = function(e) { 
    for (i = 0; i < this.length; i++) { 
     if (this[i] == e) return true; 
    } 
    return false; 
} 
Array.prototype.clone = function() { 
    return this.slice(); 
} 

function deepcopy(obj) { 
    var out = [],i = 0,len = obj.length; 
    for (; i < len; i++) { 
     if (obj[i] instanceof Array){ 
      out[i] = deepcopy(obj[i]); 
     } 
     else out[i] = obj[i]; 
    } 
    return out; 
} 

function Cube (id, front, back, left, right, top, bottom) { 
    var self = this; 
    self.id=id; 
    self.front = front; 
    self.back = back; 
    self.left = left; 
    self.right = right; 
    self.top = top; 
    self.bottom = bottom; 
    self.turnMethod1 = function(){//left-front-right-back 
     var tmp=self.left; 
     self.left=self.front; 
     self.front=self.right; 
     self.right=self.back; 
     self.back=tmp; 
    } 
    self.turnMethod2 = function(){//left-top-right-bottom 
     var tmp=self.left; 
     self.left=self.top; 
     self.top=self.right; 
     self.right=self.bottom; 
     self.bottom=tmp; 
    } 
    self.turnMethod3 = function(){//front-top-back-bottom 
     var tmp=self.front; 
     self.front=self.top; 
     self.top=self.back; 
     self.back=self.bottom; 
     self.bottom=tmp; 
    } 

    self.fn = [ 
     self.turnMethod1,self.turnMethod2,self.turnMethod3 
    ] 

} 

Cube.prototype.toString = function(){ 
    return this.id+"\t"+this.front+"\t"+this.back+"\t"+this.left+"\t"+this.right+"\t"+this.top+"\t"+this.bottom+"\n"; 
} 


var cube1=new Cube(1,"R","B","G","Y","B","Y"); 
var cube2=new Cube(2,"R","G","G","Y","B","B"); 
var cube3=new Cube(3,"Y","B","R","G","Y","R"); 
var cube4=new Cube(4,"Y","G","B","R","R","R"); 

function count() { 
    for (var i = 0; i < 3; i++) { 
     for (var n = 0; n < 4; n++) { 
      cube1.fn[i]() 
      for (var a = 0; a < 3; a++) { 
       for (var b = 0; b < 4; b++) { 
        cube2.fn[a]() 
        for (var c = 0; c < 3; c++) { 
         for (var d = 0; d < 4; d++) { 
          cube3.fn[c]() 
          for (var e = 0; e < 3; e++) { 
           for (var f = 0; f < 4; f++) { 
            if(done()){ 
             printPermutation(); 
            } 
            cube4.fn[e]() 
           }; 

          }; 

         }; 

        }; 
       }; 

      }; 
     }; 

    }; 
} 

function done() { 
    var arr = []; /*front validation*/ 
    arr.push(cube1.front); 
    if (arr.in_array(cube2.front)) { 
     return false; 
    } else { 
     arr.push(cube2.front); 
    } 

    if (arr.in_array(cube3.front)) { 
     return false; 
    } else { 
     arr.push(cube3.front); 
    } 
    if (arr.in_array(cube4.front)) { 
     return false; 
    } else { 
     arr.push(cube4.front); 
    } /*back validation*/ 
    var arr = []; 
    arr.push(cube1.back); 
    if (arr.in_array(cube2.back)) { 
     return false; 
    } else { 
     arr.push(cube2.back); 
    } 
    if (arr.in_array(cube3.back)) { 
     return false; 
    } else { 
     arr.push(cube3.back); 
    } 

    if (arr.in_array(cube4.back)) { 
     return false; 
    } else { 
     arr.push(cube4.back); 
    } 
    /*left validation*/ 
    var arr = []; 
    arr.push(cube1.left); 
    if (arr.in_array(cube2.left)) { 
     return false; 
    } else { 
     arr.push(cube2.left); 
    } 
    if (arr.in_array(cube3.left)) { 
     return false; 
    } else { 
     arr.push(cube3.left); 
    } 
    if (arr.in_array(cube4.left)) { 
     return false; 
    } else { 
     arr.push(cube4.left); 
    } /*right validation*/ 
    var arr = []; 
    arr.push(cube1.right); 
    if (arr.in_array(cube2.right)) { 
     return false; 
    } else { 
     arr.push(cube2.right); 
    } 
    if (arr.in_array(cube3.right)) { 
     return false; 
    } else { 
     arr.push(cube3.right); 
    } 
    if (arr.in_array(cube4.right)) { 
     return false; 
    } else { 
     arr.push(cube4.right); 
    } 

    return true; 
} 

function printPermutation(){ 
     console.log("----------------------------"); 
     var arr = [] 
     arr.push("Cube\tFront\tBack\tLeft\tRight\tTop\tBottom\n"); 
     arr.push(cube1.toString()); 
     arr.push(cube2.toString()); 
     arr.push(cube3.toString()); 
     arr.push(cube4.toString()); 
     console.log(arr.join("")) 
} 


function main(){ 
    count() 
} 

main() 
関連する問題