ì£¼ì €ë¦¬ ¶
ì�´ ë¬¸ì œë¥¼ 푸는ë�° í�”히 ì�´ìš©ë�˜ëŠ” Backtracking 기법ì�„ 사용하지 ì•Šê³ êµ¬í˜„í•˜ëŠ” 방법ì�´ ì—†ì�„까 해서, Case-by-case로 최소한ì�˜ ìƒ�황ì—� 대한 처리 방법ì�„ ì§€ì •í•´ë³´ì•˜ë‹¤.
가능한 ëª¨ë“ cases를 ë¶„ì„�한 ê²°ê³¼ 우로 건너기와 좌로 건너기ì—�서 ê°�ê°� ìƒ�황ì—� ë”°ë�¼ 3가지 건너기 방법ì�´ 사용ë� 수 있었다.
가능한 ëª¨ë“ cases를 ë¶„ì„�한 ê²°ê³¼ 우로 건너기와 좌로 건너기ì—�서 ê°�ê°� ìƒ�황ì—� ë”°ë�¼ 3가지 건너기 방법ì�´ 사용ë� 수 있었다.
그러나 여기ì—�서 사용한 방법ì�€ ëª¨ë“ cases를 사람ì�´ ì§�ì ‘ ì¡°ê±´ 별로 분류해 주어야 하므로 ê²°ì½” 좋ì�€ 방법ì�´ 아니다.
여기서는 구현하지 않았지만, ëª¨ë“ casesì—� 대해 ê°�ê°� 어떻게 ì²˜ë¦¬í• ìˆ˜ 있는지를 ë¨¼ì € 컴퓨터가 계산하여 DBì—� 담아서 ì�¼ê´„ 처리하면, ì�´ ë¬¸ì œê°€ ìƒ�당히 복잡해질 경우 Backtracking보다 나ì�€ 효율ì�„ ë³´ì�¼ 수ë�„ 있지 않ì�„ì§€?
소스코드 ¶
~php
<?
$s = new survive();
$s->to_right();
class survive
{
var $left, $right;
function __construct()
{
$this->left = array("canni" => 3, "missi" => 3);
$this->right = array("canni" => 0, "missi" => 0);
}
function to_right()
{
if($this->left[canni]==$this->left[missi]&&$this->left[canni]==3) $this->ferry(1,1);
elseif($this->left[canni]<>$this->left[missi]&&$this->left[canni]>1) $this->ferry(2,0);
else $this->ferry(0,2);
$this->to_left();
}
function to_left()
{
if($this->right[canni]==$this->right[missi]&&$this->right[canni]==2) $this->ferry(-1,-1);
elseif($this->right[canni]==$this->right[missi]) $this->ferry(0,-1);
else $this->ferry(-1,0);
$this->to_right();
}
function ferry($canni, $missi)
{
if($canni>=0&&$missi>=0) echo "우측 ì‹�ì�¸ì¢… {$this->right[canni]}+$canni, ì„ êµ�사 {$this->right[missi]}+$missi<br>";
elseif($canni<=0&&$missi<=0) echo "좌측 ì‹�ì�¸ì¢… {$this->left[canni]}+".(-$canni).", ì„ êµ�사 {$this->left[missi]}+".(-$missi)."<br>";
else die("�러: $canni, $missi");
$this->left[canni] -= $canni; $this->left[missi] -= $missi;
$this->right[canni] += $canni; $this->right[missi] += $missi;
if(!$this->left[canni]&&!$this->left[missi]) exit();
}
}
?>










