U E D R , A S I H C RSS

��종과선�사문제/변형진

주저리

� 문제를 푸는� �히 �용�는 Backtracking 기법� 사용하지 않고 구현하는 방법� 없�까 해서, Case-by-case로 최소한� �황� 대한 처리 방법� 지정해보았다.
가능한 모든 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();
	}
}
?>


thread


  • 모든 ì¼€ì�´ìŠ¤ë¥¼ DBì—� 저장해서 푸는것과 비슷하게 머신러ë‹�으로 학습시켜 풀게 만들면(문제 í•´ê²°ì—� 관한 state를 저장했다가 푸는것ì�´ë¯€ë¡œ 유사하다고 ìƒ�ê°�했습니다) 정답률ì�´ 얼마나 나올까요? - bluemir



Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:30:18
Processing time 0.0040 sec