2014-10-20 90 views
1

作爲一個實驗,我試圖創建一個神奇的方形程序,用九個數字檢查每個可能的正方形。對於那些不知道是誰,幻方是數字1-9的一個3x3的網格,每行,列和對角線加起來15例如:「魔方」算法

http://upload.wikimedia.org/wikipedia/commons/thumb/e/e4/Magicsquareexample.svg/180px-Magicsquareexample.svg.png

我將如何去用Lua桌子檢查每個廣場?我從下表開始:

local sq = { 
    1, 1, 1, 
    1, 1, 1 
    1, 1, 1 
} 

我該如何去檢查每個表的順序是否正確?我能夠在紙上畫出我的想法,但我不完全確定如何將它翻譯成代碼。我已經創建了函數來檢查廣場是否是'魔術'(下面),但我不確定如何以正確的方式增加每個數字。

local isMagic = function(s) 
    return (
     s[1] + s[2] + s[3] == 15 and 
     s[4] + s[5] + s[6] == 15 and 
     s[7] + s[8] + s[9] == 15 and 
     s[1] + s[4] + s[7] == 15 and 
     s[2] + s[5] + s[8] == 15 and 
     s[3] + s[6] + s[9] == 15 and 
     s[1] + s[5] + s[9] == 15 and 
     s[3] + s[5] + s[7] == 15 
    ) 
end 
+0

這裏的關鍵詞是* backtracking *。參見http://stackoverflow.com/questions/4927778/brute-force-magic-squares。 – lhf 2014-10-20 01:03:41

+0

如果您正在檢查所有可能的1-9號正方形,您可以考慮生成陣列的所有排列。下面是一個解決方案,帶有一個簡單的Java代碼鏈接:http://stackoverflow.com/questions/20272570/any-language-find-all-permutations-of-elements-in-a-vector-using-swapping – 2014-10-20 01:54:47

+0

「我將如何使用帶有Lua的桌子來檢查每個方格」以及「我將如何按照正確的順序檢查每張桌子」以及「如何以正確的方式增加每個數字」這些問題並不清楚。你已經能夠檢查給定的方塊是否有魔力,你是否試圖產生一些解決方案?通常開始廣場已經有1 2或3個單元已經填充。 – Schollii 2014-10-20 02:34:57

回答

1

基於我所看到這裏,有三種模式:

1) if we can define step by 3, we compare columns: 
sum(tab[x] for x in range(step)) == sum(tab[x] for x in xrange(step+1,step*2))== sum(tab[x] for x in xrange(2*step+1,step*3)) 

2) raws: 
sum(tab[x] for x in range(step*step) if x%step==0) == sum(tab[x] for x in range(step*step) if x%step==1)== sum(tab[x] for x in range(step*step) if x%step==2) ===> till we x%step== step-1 

3) Diagonales: 
sum(tab[x] for x in range(step*step) if x%(step+1)==0) == sum(tab[x] for x in range(step*step) if x%(step+1)==step-1) 
0

首先,你有一個2D組,爲什麼要使用一維列表? 我寧願你方要像

square[1-3][1-3] 

所以,你可以只檢查在X每行每行和Y和再檢查2個對角線。

而不是

square[1-9] 

你必須硬編碼在該解決方案中checkings,至極不會允許您設置其它尺寸的方形編碼沒有新的東西。

就像:

local square = {} 
square[1] = {[1] = 2, [2] = 7, [3] = 6} 
square[2] = {[1] = 9, [2] = 5, [3] = 1} 
square[3] = {[1] = 4, [2] = 3, [3] = 8} 

這裏是我的檢查代碼,如果一個正方形是神奇與否。 您可以根據需要設置大小。

#!/usr/local/bin/lua 

    function checkTheSquare(square, check_for) 
     local dia_sum  = 0 -- we will add the diagonal(u.l. to l.r.) values here 
     local inv_dia_sum = 0 -- we will add the diagonal(u.r. to l.l.) values here 

     for i = 1, #square do  -- for every [i] line in square 
     local temp_sum = 0 -- just holds the values for the [i] line temporary 

     for j = 1, #square do -- for every [j] line in square 
      temp_sum = temp_sum + square[i][j] -- add the square[i][j] value to temp 
     end 

     dia_sum = dia_sum + square[i][i] 
     -- this will go like: [1][1] -> [2][2] -> [3][3] ... 

     inv_dia_sum = inv_dia_sum + square[i][#square-i+1] 
     -- this will go like: [1][3] -> [2][2] -> [3][1] ...    

     if temp_sum ~= check_for then return false end 
     -- first possible find of wrong line -> NOT MAGIC 

     end 

     if dia_sum ~= check_for and inv_dia_sum ~= check_for then 
     return false 
     -- due its not magic 
     end 

     return true 
     -- ITS MAGIC! JUHUUU 
    end 


    local square = {} 
    square[1] = {[1] = 16, [2] = 3, [3] = 2, [4] = 13} 
    square[2] = {[1] = 5, [2] = 10, [3] = 11, [4] = 8} 
    square[3] = {[1] = 9, [2] = 6, [3] = 7, [4] = 12} 
    square[4] = {[1] = 4, [2] = 15, [3] = 14, [4] = 1} 

    local check_for = 34 

    print(checkTheSquare(square, check_for) == true) 

相比,你自己的代碼,它看起來比較複雜,但:

  1. 你們是不是一種算法,它的過程。
  2. 礦是動態的。人們也可以在方塊中添加隨機值,並將其平均進行多少次嘗試,以提供一個神奇的方塊。