2012-10-04 101 views
1

我正在用PHP編寫一個應用程序,用戶可以輸入兩組信息,並打印出兩組數據。目標是通過練習不同模式的問題和答案,將其作爲學習語言的教學工具。是否有算法輸出兩組元素的所有可能組合?

例如,我們可以練這個問題:「你有沒有試過......?」另外還有四項活動之一,如蹦極,帆傘運動,跳傘和潛水。還有四個可能的答案:

  1. 是的,我有,我很喜歡它。
  2. 是的,我有,但我不喜歡它。
  3. 不,我沒有,但我想嘗試一下。
  4. 不,我沒有,我不想嘗試它。

用戶將輸入兩組數據,然後應用程序將打印包含問題和答案的所有可能組合的卡片。例如,卡1看起來是這樣的:

  1. 跳傘:是的,我有,我很喜歡它。
  2. 水肺潛水:是的,但我不喜歡它。
  3. 滑翔傘:不,我沒有,但我想嘗試一下。
  4. 蹦極跳:不,我沒有,我不想嘗試它。然後

下一張牌可能是這樣的:

  1. 跳傘:是的,我有,但我不喜歡它。
  2. 水肺潛水:不,我沒有,但我想嘗試一下。
  3. 滑翔傘:不,我沒有,我不想嘗試它。
  4. 蹦極:是的,我喜歡。

因此,大家可以看到,有很多不同的可能組合。這個想法應該是兩個列表的長度相同,以允許打印出所有的可能性。同樣重要的是,任何問題或答案都不能在任何卡片上多次使用,並且這兩張卡片可能是相同的。什麼是最好的方式去做這件事?實際的投入和產出不是問題 - 我以前做過類似的事情。我只需要算法來生成組合。

編輯:我想我真正追求的是保持在同一順序每張卡的活動,但有答案的每一個可能的組合。所以我真正需要的是能夠生成以下一組索引,以便從answers數組中獲取數據。所以,我真的希望更多的東西是這樣的:

  • 0,1,2,3
  • 0,1,3,2
  • 0,2,1,3
  • 0,2,3 ,1
  • 0,3,1,2
  • 0,3,2,1
  • 1,0,2,3
  • 1,0,3,2
  • 1,2,0 ,3
  • 1,2,3,0

...等等,直到產生了所有可能的組合。

+2

的基本算法是遍歷你的第一個元素,在該循環,循環通過你的第二個元素 –

+0

這隻會給數量有限(例如:卡片1:0-0,1-1,2-2,3-3;卡片2:0-1,1-2,2-3,3-0等)的組合)。我也想要所有的組合不合適(例如:卡片12:0-2,1-1,2-0,3-3;卡片21:0-3,1-1,2-0,3- 2)。 – blainarmstrong

+0

@blainarmstrong由於編輯後的問題已經闡明瞭你想要的內容,所以我添加了一個新答案(即使它不再正確,我也會保留舊答案,因爲我覺得它回答了我和他人所認爲的問題當時的標準)。 – Stegrex

回答

1

OK,用新的標準,我想我明白了一點更好。

嘗試遞歸。我的解決辦法是亂得要命,但我可以指導您完成它:

$activities = array('a', 'b', 'c', 'd'); // Input all your activities as elements here. 
$responses = array(1, 2, 3, 4); // Input all your responses as elements here. 

// Recursive function outputCombos accepts both arrays (for eventual output). 
// $workingArray is the array of the current branch we're working with. 
function outputCombos ($activities, $responses, $workingArray) { 
    // Once the working array has been loaded to the maximum amt, print everything out. 
    if (count($workingArray) == count($responses)) { 
     echo "Combo\n"; 
     for ($x = 0; $x < count($activities); $x++) { 
      echo $activities[$x].'::'.$workingArray[$x]."\n"; 
     } 
    // If the working array isn't full, add an element that isn't currently in the working array, and recursively run the function again. 
    } else { 
     foreach ($responses as $response) { 
      // Iterate through list of all possible responses, add it into a new working array and run the function if the response hasn't been used in this working array. 
      if (!in_array($response, $workingArray)) { 
       $newArray = $workingArray; 
       $newArray[] = $response; 
       outputCombos($activities, $responses, $newArray); 
      } 
     } 
    } 
} 

foreach ($responses as $response) { 
    echo '<pre>'; 
    // Start each branch of tree with unique response (should be 4 in this case). 
    outputCombos($activities, $responses, array($response)); 
    echo '</pre>'; 
} 
+0

這似乎更像我想要做的。當我有空時,我會給它一個鏡頭。謝謝! – blainarmstrong

5

試試這個:

$activities = array(); // Input all your activities as elements here. 
$responses = array(); // Input all your responses as elements here. 

foreach ($activities as $activity) { 
    foreach ($responses as $response) { 
     echo $activities.' '.$response."\n"; 
    } 
} 
+0

請注意,這不會隨機化'卡片'。只是邏輯輸出。但是這個問題可以通過向鄰居的小孩提供這些卡片來解決,並說:「讓我們玩一個遊戲吧:這就是所謂的卡片。」 –