c实现野人过河问题

来源:互联网 发布:新顶级域名注册量排名 编辑:程序博客网 时间:2024/04/28 06:34
// Savage.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"



struct Member
{
    int savage;
    int missionary;
    Member();
    Member(int m,int s)
    {
        missionary = m;
        savage = s;
    }
};

bool Check(Member left,Member right)
{
    if ((left.missionary>=left.savage)||(left.missionary==0))
    {
        if ((right.missionary>=right.savage)||(right.missionary==0))
        {
            return true;
        }
    }
    return false;
}
bool SavageLToR(Member left,Member right,int code);
bool SavageRToL(Member left,Member right,int code);

bool SavageLToR(Member left,Member right,int code)
{
/*    bool flag = false;*/
    if (!Check(left,right))
    {
        return false;
    }
    if ((left.missionary==0)&&(left.savage==0))
    {
        return true;
    }
    if (code != 1)
    {
        if ((left.missionary>=1)&&(left.savage>=1))
        {
            if (Check(Member(left.missionary-1,left.savage-1),Member(right.missionary+1,right.savage+1)))
            {
                if(SavageRToL(Member(left.missionary-1,left.savage-1),Member(right.missionary+1,right.savage+1),1))
                {
                    return true;
                }
            }
        }
    }
    if (code != 2)
    {
        if (left.missionary>=2)
        {
            if (Check(Member(left.missionary-2,left.savage),Member(right.missionary+2,right.savage+0)))
            {
                if(SavageRToL(Member(left.missionary-2,left.savage),Member(right.missionary+2,right.savage+0),2))
                {
                    return true;
                }
            }
        }
    }
    if (code != 3)
    {
        if (left.savage>=2)
        {
            if (right.missionary>=right.savage)//限制死循环
            {
                if (Check(Member(left.missionary-0,left.savage-2),Member(right.missionary+0,right.savage+2)))
                {
                    if(SavageRToL(Member(left.missionary-0,left.savage-2),Member(right.missionary+0,right.savage+2),3))
                    {
                        return true;
                    }
                }
            }
        }
    }
    if (code != 4)
    {
        if (left.missionary>=1)
        {
            if (Check(Member(left.missionary-1,left.savage-0),Member(right.missionary+1,right.savage+0)))
            {
                if(SavageRToL(Member(left.missionary-1,left.savage-0),Member(right.missionary+1,right.savage+0),4))
                {
                    return true;
                }
            }
        }
    }
    if (code != 5)
    {
        if (left.savage>=1)
        {
            if (Check(Member(left.missionary-0,left.savage-1),Member(right.missionary+0,right.savage+1)))
            {
                if(SavageRToL(Member(left.missionary-0,left.savage-1),Member(right.missionary+0,right.savage+1),5))
                {
                    return true;
                }
            }
        }
    }
    return false;
}
bool SavageRToL(Member left,Member right,int code)
{
    if ((left.missionary==0)&&(left.savage==0))
    {
        return true;
    }
    if (code != 4)
    {
        if (right.missionary>=1)
        {
            if (Check(Member(left.missionary+1,left.savage+0),Member(right.missionary-1,right.savage-0)))
            {
                if(SavageLToR(Member(left.missionary+1,left.savage+0),Member(right.missionary-1,right.savage-0),4))
                {
                    return true;
                }
            }
        }
    }
    if (code != 5)
    {
        if (right.savage>=1)
        {
            if (Check(Member(left.missionary+0,left.savage+1),Member(right.missionary-0,right.savage-1)))
            {
                if(SavageLToR(Member(left.missionary+0,left.savage+1),Member(right.missionary-0,right.savage-1),5))
                {
                    return true;
                }
            }
        }
    }
//     if (code != 1)//无意义,导致死循环
//     {
//         if ((right.missionary>=1)&&(right.savage>=1))
//         {
//             if (Check(Member(left.missionary+1,left.savage+1),Member(right.missionary-1,right.savage-1)))
//             {
//                 if(SavageLToR(Member(left.missionary+1,left.savage+1),Member(right.missionary-1,right.savage-1),1))
//                 {
//                     return true;
//                 }
//             }
//         }
//     }
    if (code != 2)
    {
        if (right.missionary>=2)
        {
            if (Check(Member(left.missionary+2,left.savage),Member(right.missionary-2,right.savage-0)))
            {
                if(SavageLToR(Member(left.missionary+2,left.savage),Member(right.missionary-2,right.savage-0),2))
                {
                    return true;
                }
            }
        }
    }
    if (code != 3)
    {
        if (right.savage>=2)
        {
            if (left.missionary!=(right.savage+left.savage))//限制死循环
            {
                if (Check(Member(left.missionary+0,left.savage+2),Member(right.missionary-0,right.savage-2)))
                {
                    if(SavageLToR(Member(left.missionary+0,left.savage+2),Member(right.missionary-0,right.savage-2),3))
                    {
                        return true;
                    }
                }
            }
        }
    }
    return false;
}
int _tmain(int argc, _TCHAR* argv[])
{
    for (int i=0;i<10;i++)
    {
        for (int j=0;j<10;j++)
        {
            Member left(i,j);
            Member Right(0,0);
            if (j==3)
            {
                j=3;
            }
            if (SavageLToR(left,Right,0))
            {
                printf("%d,%d:    ok\n",i,j);
            }
            else
            {
                printf("%d,%d:    no\n",i,j);
            }
        }
    }
    
    return 0;
}