2438: 三人三鬼
时间限制: 1 Sec 内存限制: 128 MB提交: 35 解决: 9
题目描述
目标是将东岸的3人3鬼通过一只小船转移到西岸,希望以尽可能少的摆渡次数。
船的容量有限,一次最多只能坐2人(或2鬼或1人1鬼)。
无论是在河的东岸还是在河的西岸,一旦鬼数多于人数,则人被鬼扔到河中。
怎样渡河的大权掌握在人的手中。
只求一种渡河方案。依次输出东岸的状态。
输入
无输入
输出
依次输出东岸的状态
样例输入
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;
}