YTU 2438: 三人三鬼

2438: 三人三鬼

时间限制: 1 Sec   内存限制: 128 MB
提交: 35   解决: 9

题目描述

*目标是将东岸的33鬼通过一只小船转移到西岸,希望以尽可能少的摆渡次数。
*船的容量有限,一次最多只能坐2人(或2鬼或11鬼)。
*无论是在河的东岸还是在河的西岸,一旦鬼数多于人数,则人被鬼扔到河中。
*怎样渡河的大权掌握在人的手中。
*只求一种渡河方案。依次输出东岸的状态。

输入

无输入

输出

依次输出东岸的状态

样例输入

NO

样例输出

x:(a,b)
....

迷失在幽谷中的鸟儿,独自飞翔在这偌大的天地间,却不知自己该飞往何方……

#include<iostream>
using namespace std;
bool AQ,CHF;
struct state
{
    int r;
    int g;
} s[15],d[7]= {{0,0},{0,-2},{-1,-1},{- 2,0},{0,1},{1,1},{1,0}};
void display(int p)
{
    for(int i=1; i<=p; i++)
        cout <<i<<":("<< s[i].r<<","<< s[i].g << ")"<< endl;
}
int main()
{
    s[1].r=3;
    s[1].g=3;
    int u=3,v=3;
    int a,mu,mv;
    int flag1=0;
    int flag2=0;
    int k=0;
    while(!(u==0 && v==0))
    {
        k++;
        if (k%2 == 0)
            a=4;
        else
            a=1;
        for (int i=a; i<=a+2; i++)
        {
            mu = u + d[i].r;
            mv = v + d[i].g;
            if ( mu>3 || mv>3 || mu<0 || mv<0 ||(mu==3 && mv==3 ))continue;
            AQ = ((mu==3) || (mu==0)  ||(mu==1 && mv==1) ||(mu==2 && mv==2) );
            CHF = (flag1) && (flag2);
            if (mu==0 || (AQ&& (!CHF)) )
            {
                u = mu;
                v = mv;
                s[k+1].r=u;
                s[k+1].g=v;
                if(u==1&&v==1) flag1++;
                if(u==2&&v==2) flag2++;
                break;
            }
        }
    }
    display(k+1);
    return 0;
}

你可能感兴趣的:(YTU 2438: 三人三鬼)