°í±Þ ¾Ë°í¸®Áò
±èÁøÈ«
<¸ñ»ç¿Í ½ÄÀÎÁ¾
¹®Á¦> Ç®ÀÌ º¸°í¼
1. ¸ñ»ç¿Í ½ÄÀÎÁ¾ Á÷Á¢ Ç®ÀÌ
¡®¸ñ»ç¿Í ½ÄÀÎÁ¾¡¯ ¹®Á¦¸¦ ¼ÕÀ¸·Î Ç®¾îº¸¸é, ¾Æ·¡ÀÇ 11 ´Ü°è·Î ÇØ°áµÇ´Â°ÍÀ» ¾Ë ¼ö ÀÖ´Ù.
´ë»ó |
¹æÇâ |
½ÄÀÎÁ¾ 2 |
¢ç |
½ÄÀÎÁ¾ 1 |
¬ |
½ÄÀÎÁ¾ 2 |
¢ç |
½ÄÀÎÁ¾ 1 |
¬ |
¸ñ»ç 2 |
¢ç |
¸ñ»ç 1 ½ÄÀÎÁ¾ 1 |
¬ |
¸ñ»ç 2 |
¢ç |
½ÄÀÎÁ¾ 1 |
¬ |
½ÄÀÎÁ¾ 2 |
¢ç |
½ÄÀÎÁ¾ 1 |
¬ |
½ÄÀÎÁ¾ 2 |
¢ç |
À§ÀÇ ´Ü°è¸¦ ºÐ¼®ÇØ º» °á°ú ¾Æ·¡ Å×À̺í°ú °°ÀÌ Å©°Ô 3°¡ÁöÀÇ ÇüÅ·Π±¸ºÐÇÒ ¼ö ÀÖ¾ú´Ù.
ÇüÅ |
ÇüŹøÈ£ |
´ë»ó |
¹æÇâ |
½ÄÀÎÁ¾À» ¸ðµÎ ¢ç ·Î ¿Å±è |
1 |
½ÄÀÎÁ¾ 2 |
¢ç |
½ÄÀÎÁ¾ 1 |
¬ |
||
½ÄÀÎÁ¾ 2 |
¢ç |
||
µ¹¾Æ¿À±â |
|
½ÄÀÎÁ¾ 1 |
¬ |
¸ñ»ç¸¦ ¸ðµÎ ¢ç·Î ¿Å±è (¾ÈÀüÇÏ°Ô) |
2 |
¸ñ»ç 2 |
¢ç |
¸ñ»ç 1 ½ÄÀÎÁ¾ 1 |
¬ |
||
¸ñ»ç 2 |
¢ç |
||
µ¹¾Æ¿À±â |
|
½ÄÀÎÁ¾ 1 |
¬ |
½ÄÀÎÁ¾À» ¸ðµÎ ¢ç·Î ¿Å±è |
3 |
½ÄÀÎÁ¾ 2 |
¢ç |
½ÄÀÎÁ¾ 1 |
¬ |
||
½ÄÀÎÁ¾ 2 |
¢ç |
À§¿Í °°ÀÌ 3°¡ÁöÀÇ ÇüÅ·Π±¸ºÐÀÌ µÇ¸ç ±× Áß¿¡ ÇüŹøÈ£ 1°ú ÇüŹøÈ£ 3Àº µ¿ÀÏÇÑ ÇüÅÂÀÓÀ» ¾Ë ¼ö ÀÖ´Ù. ±×·¯¹Ç·Î ¼·Î´Ù¸¥ ÇüÅ´ ½ÇÁ¦·Î µÎ °¡Áö°¡ µÇ¸ç, ±×°ÍÀº ½ÄÀÎÁ¾À» ¸ðµÎ ¿Å±â´Â °úÁ¤(ÇüÅÂ)°ú ¸ñ»ç¸¦ ¸ðµÎ ¿Å±â´Â °úÁ¤ »ÓÀÌ°Ô µÈ´Ù.
2. Ãʱâ À̵¿ ´ë»ó ¼±ÅÃ
óÀ½ ½ÃÀÛ¿¡¼ ¿ì¸®´Â ¸ñ»ç³ª ½ÄÀÎÁ¾ µÑ Áß¿¡ ÇѸíÀ» ¿Å±â°Å³ª ¸ñ»ç¿Í ½ÄÀÎÁ¾ µÑÀ» ¿Å±æ ¼ö ÀÖ´Ù. ÇÏÁö¸¸ ¸ñ»ç¸¦ ¿Å±â¸é ³²¾ÆÀÖ´Â ¸ñ»çÀÇ ¼ö°¡ ½ÄÀÎÁ¾ ¼ö º¸´Ù ÁÙ°Ô µÊÀ¸·Î ÀÌ°ÍÀº ºÒ°¡´ÉÇÏ´Ù. ¸ñ»ç¿Í ½ÄÀÎÁ¾ µÑÀ» ¿Å±â¸é, ´Ù½Ã ¹è¸¦ °¡Áö°í ¿Ã¶§ ¸ñ»çÀÇ ¾ÈÀüÀ» À§ÇØ ½ÄÀÎÁ¾¿¡ µ¹¾Æ°¡¼´Â ¾ÈµÇ¹Ç·Î ¹Ýµå½Ã ¸ñ»ç°¡ µ¹¾Æ°¡¾ß Çϴµ¥, À̶§ÀÇ °á°ú´Â °á±¹ ½ÄÀÎÁ¾ ÇÑ¸í¸¸ÀÌ °°Ç³Ê·Î ¿Å°ÜÁø°Í »ÓÀÌ´Ù.
°á±¹ óÀ½ ½ÃÀÛ¿¡¼ ¸ñ»ç¿Í ½ÄÀÎÁ¾À» ¿Å°Ü ¸ñ»ç°¡ µ¹¾Æ¿À´Â°Í°ú ½ÄÀÎÁ¾ µÑÀÌ À̵¿ÇØ ½ÄÀÎÁ¾ ÇѸíÀÌ µ¹¾Æ¿À´Â°Í°ú °á°ú°¡ °°´Ù. ¿©±â¼´Â ½ÄÀÎÁ¾ µÑÀ» ¸ÕÀú ¿Å±â´Â°ÍÀ» óÀ½À¸·Î ¼±ÅÃÇÏ°Ú´Ù.
3. ±ÔÄ¢
3.1 ´ë»ó À̵¿À» À§ÇÑ ÇüÅÂ(ÆÐÅÏ)
´ë»óÀÌ À̵¿Çϱâ À§ÇØ ¡®¹è¡¯ ¶ó´Â ¼ö´ÜÀ» »ç¿ëÇÏ°í ÀÖÀ¸¸ç ³²¾ÆÀÖ´Â »ç¶÷µéÀ» À§ÇØ ¹è¸¦ µ¹¿© º¸³»¾ß ÇϹǷΠÃÖ¼ÒÇÑ ÇѸíÀº µ¹¾Æ¿Í¾ß ÇÑ´Ù.
±×·¸´Ù¸é À̵¿ÇÏ·Á´Â ´ë»óÀÇ ¼ö°¡ µ¹¾Æ¿À´Â ¼öº¸´Ù ¸¹¾Æ¾ß ÇÑ´Ù. ¹è°¡ ¼ö¿ëÇÒ ¼ö ÀÖ´Â Àοø ¼ö´Â ÃÖ´ë µÎ ¸íÀ̹ǷΠ°Ç³Ê°¥¶§¿¡´Â µÎ¸íÀÌ, µ¹¾Æ¿Ã¶§´Â ÇѸíÀÌ À̵¿ÇØ¾ß °á°úÀûÀ¸·Î ¸ðµÎ °Ç³Ê°¡°Ô µÈ´Ù. ±×·¯¹Ç·Î ½ÄÀÎÁ¾ÀÌ ¿Å°Ü°¡·Á¸é °¥¶§ µÎ¸í, ¿Ã¶§ ÇѸíÀÌ ¿À¸é µÈ´Ù.
¸ñ»ç´Â À§ÀÇ ¡®Ãʱâ À̵¿ ´ë»ó ¼±Å᯿¡ µû¶ó ¹Ýµå½Ã ½ÄÀÎÁ¾ÀÌ ¸ðµÎ ¿Å°ÜÁø ´ÙÀ½, ±×¸®°í ½ÄÀÎÁ¾ Çϳª°¡ ¹è¸¦ °¡Áö°í µ¹¾Æ¿Â ÈÄ (°á±¹ °Ç³Ê°£°Ç ½ÄÀÎÁ¾ µÎ¸í)¿¡ ¿òÁ÷ÀÏ ¼ö ÀÖ´Ù.
±×¸®°í ¸ñ»çÀÇ ¼ö°¡ Ç×»ó ½ÄÀÎÁ¾ÀÇ ¼ö ÀÌ»óÀ̾î¾ß ÇϹǷΠ°Ç³Ê°¥¶§¿¡´Â µÎ¸íÀÌ °¥ ¼ö ÀÖÁö¸¸ µ¹¾Æ¿Ã¶§ ¾ç °º¯ÀÇ ¸ñ»ç¼ö°¡ ½ÄÀÎÁ¾ ¼ö ÀÌ»óÀÏ ¼ö ÀÖµµ·Ï °í·ÁÇØ¾ß ÇÑ´Ù.
¾ç °º¯ÀÇ ¸ñ»ç¿Í ½ÄÀÎÁ¾ ¼öÀÇ ºñÀ²À» ¸ÂÃß¾î¾ß ÇϹǷΠµ¹¾Æ°¥¶§ ¸ñ»ç¿Í ½ÄÀÎÁ¾ °¢°¢ ÇÑ¸í¾¿ ¸ðµÎ µÎ¸íÀÌ ¹è¸¦ Ÿ°í µ¹¾Æ¿Í¾ß ÇÑ´Ù. ´Ù½Ã¸»Çϸé, À§¿¡¼ ¾ð±ÞÇÑ°Íó·³, ´ë»óÀÌ À̵¿ÇÏ·Á¸é º¸³¾¶§´Â µÎ¸í, µ¹¾Æ¿Ã¶§´Â ÇѸíÀÌ µ¹¾Æ¿Í¾ß À̵¿ÀÌ ÀÌ·ç¾îÁø´Ù. ±×¸®°í ¿©±â¼´Â ¾ç °º¯ÀÇ »ç¶÷ ¼ö ºñÀ²±îÁö ¸ÂÃß¾î¾ß ÇϹǷΠµ¹¾Æ¿Ã¶§ ¸ñ»ç ÇѸí°ú ½ÄÀÎÁ¾ ÇѸíÀÌ µ¹¾Æ¿Í¾ß ¾ÈÀüÇÑ À̵¿ÀÌ ¼º¸³µÈ´Ù.
3.2 ±ÔÄ¢ »ý¼º
3.1À» Á¤¸®ÇÏ¸é ¾Æ·¡ÀÇ °úÁ¤ÀÌ ³ª¿Â´Ù.
(1) ½ÄÀÎÁ¾À» ¸ðµÎ ¸ÕÀú ¿Å±â°í, ¸ñ»ç¸¦ ¸ðµÎ ¿Å±ä´Ù.
(2) ´ë»óÀ» ¿Å±â·Á¸é º¸³¾¶§ µÎ¸í, ¹è¸¦°¡Áö°í µ¹¾Æ¿Ã¶§ ÇѸíÀÌ ÇÊ¿äÇÏ´Ù.
(3) ½ÄÀÎÁ¾À» ¿Å±æ¶§´Â º¸³¾¶§ ½ÄÀÎÁ¾ µÑ, µ¹¾Æ¿Ã¶§ ½ÄÀÎÁ¾ Çϳª¿©¾ß ÇÑ´Ù.
(4) ¸ñ»ç¸¦ ¿Å±æ¶§´Â º¸³¾¶§ ¸ñ»ç µÑ, µ¹¾Æ¿Ã¶§ ¸ñ»ç Çϳª ½ÄÀÎÁ¾ Çϳª¾¿À̾î¾ß
ÇÑ´Ù.
À§ÀÇ °úÁ¤ Áß (4)¸¦ º¸¸é µ¹¾Æ¿Ã¶§ ¸ñ»ç¿Í ½ÄÀÎÁ¾ Çϳª¾¿ÀÌÁö¸¸, ¸ñ»ç°¡ ¸ðµÎ À̵¿µÈ ÈÄ¿¡´Â ¸ñ»ç°¡ µ¹¾Æ°¡¼´Â ¾ÈµÇ¹Ç·Î (°Ç³ÊÆí¿¡ ³²¾Æ ÀÖ´Â ½ÄÀÎÁ¾ÀÌ ´õ ¸¹°Ô µÇ¹Ç·Î), ±×¶§¿¡´Â ½ÄÀÎÁ¾ ÇÑ¸í¸¸À» µ¹·Áº¸³½´Ù. ÀÌ °úÁ¤À» (4)¿¡ Ãß°¡ÇÑ´Ù.
(4) ¸ñ»ç¸¦ ¿Å±æ¶§´Â º¸³¾¶§ ¸ñ»ç µÑ, µ¹¾Æ¿Ã¶§ ¸ñ»ç Çϳª ½ÄÀÎÁ¾ Çϳª¾¿À̾î¾ß
ÇÑ´Ù.
¸ñ»ç¸¦ ¸ðµÎ ¿Å°åÀ¸¸é ½ÄÀÎÁ¾ ÇÑ¸í¸¸ µ¹·Áº¸³½´Ù.
½ÄÀÎÁ¾À» ¸ðµÎ ¿Å±â´Â °úÁ¤°ú ¸ñ»ç¸¦ ¸ðµÎ ¿Å±â´Â °úÁ¤À» µÎ°³ÀÇ stepÀ¸·Î º¸ÀÚ.
Step 1: ½ÄÀÎÁ¾À» ¸ðµÎ ¿Å°Ü¶ó. Step 2: ¸ñ»ç¸¦ ¸ðµÎ ¿Å°Ü¶ó. |
Step 1Àº ¡®°úÁ¤¡¯ Áß (3)¹øÀ» ÀÌ¿ëÇÏ°í, Step 2´Â (4)¹øÀ» ÀÌ¿ëÇÑ´Ù.
Step 1: ½ÄÀÎÁ¾À» ¸ðµÎ ¿Å°Ü¶ó. º¸³¾¶§: ½ÄÀÎÁ¾ 2, µ¹¾Æ¿Ã¶§: ½ÄÀÎÁ¾ 1 Step 2: ¸ñ»ç¸¦ ¸ðµÎ ¿Å°Ü¶ó. º¸³¾¶§: ¸ñ»ç 2, µ¹¾Æ¿Ã¶§: ¸ñ»ç 1 ½ÄÀÎÁ¾ 1, ȤÀº ½ÄÀÎÁ¾ 1 |
¿ì¸®´Â ¸ñ»ç¸¦ ¸ðµÎ ¿Å±äÈÄ ½ÄÀÎÁ¾À» ÃÖÁ¾ÀûÀ¸·Î ¸ðµÎ ¿Å±â¸é ¹®Á¦°¡ ÇØ°áµÇ´Â°ÍÀ» ¾Ë ¼ö ÀÖÀ¸¹Ç·Î Step 1¿¡´Â ÇØ°á½Ã Á¾·áÇÏ´Â Á¶°ÇÀ» Ãß°¡ÇØ¾ß ÇÑ´Ù.
±×¸®°í µÎ StepÀ» »óÅ¿¡ ¸ÂÃß¾î ¹ø°¥¾Æ ¼öÇàÇØ¾ß Çϴµ¥ StepÀ» ÀüȯÇÏ´Â Á¶°ÇÀº ÀÌ·¸´Ù.
Step 1¿¡¼´Â ½ÄÀÎÁ¾ÀÌ ¸ðµÎ ¿Å°ÜÁ³À»¶§ Step 2·Î À̵¿ÇÑ´Ù.
Step 2¿¡¼´Â ¸ñ»ç°¡ ¸ðµÎ ¿Å°ÜÁö´Â ¼ø°£ Step 1À¸·Î À̵¿ÇÑ´Ù.
ÀÌ¿Í °°Àº Á¶°ÇÀ» Ãß°¡ÇØ ¿Ï¼ºµÈ ±ÔÄ¢Àº ¾Æ·¡¿Í °°´Ù.
Step 1: ½ÄÀÎÁ¾À» ¸ðµÎ ¿Å°Ü¶ó. º¸³¾¶§: ½ÄÀÎÁ¾ 2, µ¹¾Æ¿Ã¶§: ½ÄÀÎÁ¾ 1 ¸¸¾à, ¸ñ»ç¿Í ½ÄÀÎÁ¾ÀÌ ¸ðµÎ ¿Å°ÜÁ³À¸¸é Á¾·á. ¸¸¾à, ½ÄÀÎÁ¾ÀÌ ¸ðµÎ ¿Å°ÜÁö¸é Step 2·Î. Step 2: ¸ñ»ç¸¦ ¸ðµÎ ¿Å°Ü¶ó. º¸³¾¶§: ¸ñ»ç 2, µ¹¾Æ¿Ã¶§: ¸ñ»ç 1 ½ÄÀÎÁ¾ 1, ȤÀº ½ÄÀÎÁ¾ 1 ¸¸¾à, ¸ñ»ç°¡ ¸ðµÎ ¿Å°ÜÁ³À¸¸é Step 1·Î. |
À§ÀÇ ±ÔÄ¢À» psuedo code·Î ±¸ÇöÇÏ¸é ¾Æ·¡¿Í °°´Ù.
dir ¬ ¿À¸¥ÂÊ; step ¬ 1; loop { if step == 1, { if dir == ¿À¸¥ÂÊ, ½ÄÀÎÁ¾ 2À» dir¹æÇâÀ¸·Î; if dir == ¿ÞÂÊ, ½ÄÀÎÁ¾ 1À» dir¹æÇâÀ¸·Î; if ¸ñ»ç¿Í ½ÄÀÎÁ¾ ¸ðµÎ ¿Å°ÜÁ³À¸¸é, Á¾·á; if ½ÄÀÎÁ¾ÀÌ ¸ðµÎ µµÂøÇϸé, step ¬ 2; } if step == 2, { if dir == ¿À¸¥ÂÊ, ¸ñ»ç 2À» dir¹æÇâÀ¸·Î; if dir == ¿ÞÂÊ, if ¸ñ»ç°¡ ¸ðµÎ µµÂøÇßÀ¸¸é, ½ÄÀÎÁ¾ 1À» dir¹æÇâÀ¸·Î; else, ¸ñ»ç 1 ½ÄÀÎÁ¾ 1À» dir¹æÇâÀ¸·Î; if ¸ñ»ç°¡ ¸ðµÎ µµÂøÇßÀ¸¸é, step ¬ 1; }
if dir == ¿À¸¥ÂÊ, dir ¬ ¿ÞÂÊ; else dir ¬ ¿À¸¥ÂÊ; } |
------------------ SOURCE --------------------
#include <stdio.h>
#include <conio.h>
#include <windows.h>
typedef struct
{
int
mis;
int
can;
} BANKSTRUCT;
BANKSTRUCT bank[2]; //
left bank, right bank
#define MAX_STEP 2
#define MAX_RULE 2
#define MAX_SIDE 2
#define STEP_DONE 0
#define STEP_GOTO_1 1
#define STEP_GOTO_2 2
#define STEP_CONTINUE 3
// 0: CAN, CAN
// 1: CAN only
// 2: MIS, CAN
// 3: MIS, MIS
// 4: MIS only
char *rule_name[] = {"2 Cannibals",
"1
Cannibal",
"1
Missionary And 1 Cannibal",
"2
Missionaries",
"1
Missionary" };
#define CANCAN 0
#define CAN 1
#define MISCAN 2
#define MISMIS 3
#define MIS 4
int rule_table[MAX_STEP][MAX_RULE][MAX_SIDE] = \
{ {{CANCAN, CAN}, {NULL, NULL}}, {{MISMIS, MISCAN}, {NULL, CAN}} };
int movepeople(int dir, int todo)
{
static
int s, t;
s
= 0;
t
= 1;
if
(dir == 1)
{
s
= 1;
t
= 0;
}
switch(todo)
{
case
0:
if
(bank[s].can < 2)
return
0;
bank[s].can
-= 2; // move can, can
bank[t].can
+= 2;
break;
case
1:
if
(bank[s].can == 0)
return
0;
bank[s].can--; //
move can only
bank[t].can++;
break;
case
2:
if
(bank[s].mis == 0 || bank[s].can == 0)
return
0;
bank[s].mis--; //
move mis, can
bank[t].mis++;
bank[s].can--;
bank[t].can++;
break;
case
3:
if
(bank[s].mis < 2)
return
0;
bank[s].mis
-= 2; // move mis, mis
bank[t].mis
+= 2;
break;
case
4:
if
(bank[s].mis == 0)
return
0;
bank[s].mis--; //
move mis only
bank[t].mis++;
break;
}
return
1;
}
void resetcondition()
{
bank[0].mis
= 3;
bank[0].can
= 3;
bank[1].mis
= 0;
bank[1].can
= 0;
}
int checkstep(int cur_step)
{
if
(cur_step == 0)
{
if
(bank[1].mis == 3 && bank[1].can == 3)
return
STEP_DONE;
if
(bank[1].can == 3)
return
STEP_GOTO_2;
}
if
(cur_step == 1)
{
if
(bank[1].mis == 3)
return
STEP_GOTO_1;
}
return
STEP_CONTINUE;
}
void displaystate(int rule, int dir)
{
static
int step = 0;
int
i;
step++;
printf("---STEP
%d---------------------\n", step);
if
(rule == -1)
{
printf("<Ohmygod>
Simulator\n");
printf("Press
any key to start!\n");
getch();
}
else
printf("Move:
%s %s\n", rule_name[rule],
(dir
== 0) ? "To The Right" : "To The Left");
for
(i=0; i<3; i++)
{
if
(i < bank[0].mis)
printf("
Mis");
printf("\t\t\t");
if
(i < bank[1].mis)
printf("
Mis");
printf("\n");
}
for
(i=0; i<3; i++)
{
if
(i < bank[0].can)
printf("
Can");
printf("\t\t\t");
if
(i < bank[1].can)
printf("
Can");
printf("\n");
}
Sleep(2000);
}
void ohmygod()
{
int
step = 0;
int
dir = 0; //
left to right
int
cs;
int
stop = 0;
int
rule;
while
(!stop)
{
rule
= 0;
if
(!movepeople(dir, rule_table[step][rule][dir]))
{
rule
= 1;
movepeople(dir,
rule_table[step][rule][dir]);
}
cs
= checkstep(step);
switch(cs)
{
case
STEP_DONE:
stop
= 1;
break;
case
STEP_GOTO_1:
step
= 0;
break;
case
STEP_GOTO_2:
step
= 1;
break;
case
STEP_CONTINUE:
break;
}
displaystate(rule,
dir);
//
turn the direction
dir
= (dir == 0) ? 1:0;
}
}
void main()
{
resetcondition();
displaystate(-1,
-1);
ohmygod();
printf("Done!\n");
}