°í±Þ ¾Ë°í¸®Áò

 

±èÁøÈ«

 

<¸ñ»ç¿Í ½ÄÀÎÁ¾ ¹®Á¦> Ç®ÀÌ º¸°í¼­

 

 

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");

}