YTU 2438: 三人三鬼
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; }
------------------- 这是千千的个人网站哦! https://www.dreamwings.cn -------------------