最近找工作闲来无事,看到http://topic.csdn.net/t/20021206/23/1239072.html问题。

就编了个程序解决这个问题。

三只母鸡,三只小鸡在河东岸,一条小舟每次最多载两只鸡(大小不论)。

条件:

1、母鸡都会划船。

2、只有一只小鸡会划船,其余两只不会。

3、当小鸡母亲不在身边时,其余母鸡就会啄死这只小鸡。

此题目转自http://topic.csdn.net/t/20021206/23/1239072.html

一个解读是,船上和岸上是不同地方。

程序采用回溯法。在东岸上船尽量上两只鸡。在西岸尽量只上一只鸡。

一下代码在VC6中运行。

头文件 ChickRiver.h

#ifndef _CHICK_RIVER_H #define _CHICK_RIVER_H #define NUMBER_CHICK 6 #define BOAT_CARRY 2 enum {EAST, WEST, RIVER}; enum {TOWEST, TOEAST}; enum {BIG, SMALL}; typedef struct { int id; int type; int relate; bool bDriver; } chick_character; typedef struct tree_node { int chick_pos[NUMBER_CHICK]; //鸡的位置 int boat_pos; //船的位置 int boat_dir; int level; tree_node *pParent; tree_node *pSubtree; tree_node *pNext; //单链表 下一个 }tree_node; void init_chick(chick_character *pChick, int index, int type, int relate, bool bDriver); void init_node(tree_node *pNode, tree_node *pParent); void copy_node(tree_node *pNodeDes, tree_node *pNodeSrc); void ReleaseNode(tree_node* pParent); tree_node *CrossRiver(tree_node *pRoot, tree_node *pParent, chick_character *pChick); tree_node *UpBoat_East(tree_node *pRoot, tree_node *pParent, chick_character *pChick); tree_node *UpBoat_West(tree_node *pRoot, tree_node *pParent, chick_character *pChick); tree_node *DownBoat(tree_node *pRoot, tree_node *pParent, chick_character *pChick); void AddSubTree(tree_node* pParent, tree_node* pSubTree); bool IsEaten_node(tree_node *pNode, chick_character*pChick); bool IsRepeat_node(tree_node *pParent, tree_node *pNode); int GetNumInBoat(tree_node *pNode, int *pBoatIndex); void print_node(tree_node *pParent, chick_character *pChick); void print_reault(tree_node *pParent, chick_character *pChick); void print_stack(tree_node *pParent, chick_character *pChick); #endif

文件ChickRiver.cpp

#include "ChickRiver.h" #include <stdio.h> #include <windows.h> #include <stack> int main(int argc, char* argv[]) { //init chick chick_character *pChick = new chick_character[NUMBER_CHICK]; for(int i=0; i<NUMBER_CHICK; i++) { if(i%2==0) { init_chick(pChick+i, i, BIG, i+1, TRUE); } else if(i==1) //the first small chick can driver boat { init_chick(pChick+1, 1, SMALL, i-1, TRUE); } else { //other small chick can't driver boat init_chick(pChick+i, i, SMALL, i-1, FALSE); } } //init node tree_node *pRoot = new tree_node; init_node(pRoot, NULL); //bigin algorithm tree_node *pLeaf = CrossRiver(pRoot, pRoot, pChick); //result if(pLeaf!=NULL) { printf("succeed cross river and /n"); print_stack(pLeaf, pChick); } else { printf("failed cross river and /n"); } //release tree ReleaseNode(pRoot); return 0; } tree_node *CrossRiver(tree_node *pRoot, tree_node *pParent, chick_character *pChick) { //判断是否已经成功 //print_node(pParent, pChick); BOOL bSucc=TRUE; for(int i=0; i<NUMBER_CHICK; i++) { if(pParent->chick_pos[i]!=WEST) { bSucc=FALSE; break; } } if(bSucc) { return pParent; } tree_node *pLeaf = NULL; switch(pParent->boat_pos) { case EAST: { pLeaf = UpBoat_East(pRoot, pParent, pChick); } break; case WEST: { pLeaf = UpBoat_West(pRoot, pParent, pChick); } break; case RIVER: { pLeaf = DownBoat(pRoot, pParent, pChick); } break; default: { printf("wrong in boat position/n"); } } return pLeaf; } /* * init chick */ void init_chick(chick_character *pChick, int index, int type, int relate, bool bDriver) { pChick->id = index; pChick->type = type; pChick->relate = relate; pChick->bDriver = bDriver; } /* * init node */ void init_node(tree_node *pNode, tree_node *pParent) { int i; if(pParent!=NULL) { for(i=0; i<NUMBER_CHICK; i++) { pNode->chick_pos[i] = pParent->chick_pos[i]; } pNode->boat_pos = pParent->boat_pos; pNode->boat_dir = pParent->boat_dir; pNode->pParent = pParent; pNode->level = pParent->level+1; } else { for(i=0; i<NUMBER_CHICK; i++) { pNode->chick_pos[i] = EAST; } pNode->boat_pos = EAST; pNode->boat_dir = TOWEST; pNode->level=0; pNode->pParent = NULL; } pNode->pSubtree = NULL; pNode->pNext = NULL; } /* * copy node */ void copy_node(tree_node *pNodeDes, tree_node *pNodeSrc) { int i; if(pNodeSrc!=NULL) { for(i=0; i<NUMBER_CHICK; i++) { pNodeDes->chick_pos[i] = pNodeSrc->chick_pos[i]; } pNodeDes->boat_pos = pNodeSrc->boat_pos; pNodeDes->boat_dir = pNodeSrc->boat_dir; pNodeDes->pParent = pNodeSrc->pParent; pNodeDes->level = pNodeSrc->level; pNodeDes->pSubtree = pNodeSrc->pSubtree; pNodeDes->pNext = pNodeSrc->pNext; } else { printf("fail copy node for no src/n"); } } /* * release node */ void ReleaseNode(tree_node* pParent) { if(pParent->pSubtree==NULL) { delete pParent; pParent=NULL; } else { tree_node **ppSubTree = &pParent->pSubtree; tree_node *pNodeTemp; while(*ppSubTree!=NULL) { pNodeTemp = *ppSubTree; ppSubTree = &(*ppSubTree)->pNext; ReleaseNode(pNodeTemp); } } } /* * two chick get up a empty boat */ tree_node *UpBoat_Empty_2(tree_node *pRoot, tree_node *pParent, chick_character *pChick, tree_node* pNodeTemp, int boat_dir_new) { tree_node *pLeaf = NULL; int i, j; int boat_pos = pParent->boat_pos; for(i=0; i<NUMBER_CHICK; i++) { for(j=i; j<NUMBER_CHICK; j++) { if(i!=j) { if(pParent->chick_pos[i]==boat_pos&&pParent->chick_pos[j]==boat_pos) { if(pChick[i].bDriver||pChick[j].bDriver) { init_node(pNodeTemp, pParent); pNodeTemp->chick_pos[i] = RIVER; pNodeTemp->chick_pos[j] = RIVER; //printf("is eaten in boat? %d %d/n", i, j); if(!IsEaten_node(pNodeTemp, pChick)) { //printf("no eaten in boat %d %d/n", i, j); pNodeTemp->boat_pos = RIVER; pNodeTemp->boat_dir = boat_dir_new; if(!IsRepeat_node(pRoot, pNodeTemp)) { tree_node *pNodeSub = new tree_node; copy_node(pNodeSub, pNodeTemp); AddSubTree(pParent, pNodeSub); pLeaf = CrossRiver(pRoot, pNodeSub, pChick); if(pLeaf!=NULL) return pLeaf; } } } } } } } return pLeaf; } /* * one chick get up a empty boat */ tree_node *UpBoat_Empty_1(tree_node *pRoot, tree_node *pParent, chick_character *pChick, tree_node* pNodeTemp, int boat_dir_new) { tree_node *pLeaf = NULL; int i; //, j; int boat_pos = pParent->boat_pos; for(i=0; i<NUMBER_CHICK; i++) { if(pParent->chick_pos[i]==boat_pos) { if(pChick[i].bDriver) { init_node(pNodeTemp, pParent); pNodeTemp->chick_pos[i] = RIVER; if(!IsEaten_node(pNodeTemp, pChick)) { pNodeTemp->boat_pos = RIVER; pNodeTemp->boat_dir = boat_dir_new; if(!IsRepeat_node(pRoot, pNodeTemp)) { tree_node *pNodeSub = new tree_node; copy_node(pNodeSub, pNodeTemp); AddSubTree(pParent, pNodeSub); pLeaf = CrossRiver(pRoot, pNodeSub, pChick); if(pLeaf!=NULL) return pLeaf; } } } } } return pLeaf; } /* * one chick get up a no empty boat */ tree_node *UpBoat_1_1(tree_node *pRoot, tree_node *pParent, chick_character *pChick, tree_node* pNodeTemp, int boat_dir_new, int iboat) { tree_node *pLeaf = NULL; int i; //, j; int boat_pos = pParent->boat_pos; for(i=0; i<NUMBER_CHICK; i++) { if(pParent->chick_pos[i]==boat_pos) { if(pChick[iboat].bDriver||pChick[i].bDriver) { init_node(pNodeTemp, pParent); pNodeTemp->chick_pos[i] = RIVER; if(!IsEaten_node(pNodeTemp, pChick)) { pNodeTemp->boat_pos = RIVER; pNodeTemp->boat_dir = boat_dir_new; if(!IsRepeat_node(pRoot, pNodeTemp)) { tree_node *pNodeSub = new tree_node; copy_node(pNodeSub, pNodeTemp); AddSubTree(pParent, pNodeSub); pLeaf = CrossRiver(pRoot, pNodeSub, pChick); if(pLeaf!=NULL) return pLeaf; } } } } } return pLeaf; } /* * no chick get up a no empty boat */ tree_node *UpBoat_1_0(tree_node *pRoot, tree_node *pParent, chick_character *pChick, tree_node* pNodeTemp, int boat_dir_new, int iboat) { tree_node *pLeaf = NULL; if(pChick[iboat].bDriver) { init_node(pNodeTemp, pParent); pNodeTemp->boat_pos = RIVER; pNodeTemp->boat_dir = boat_dir_new; //if(boat_dir_new==TOWEST) printf("chick %d try to back single/n", iboat); if(!IsRepeat_node(pRoot, pNodeTemp)) { //if(boat_dir_new==TOWEST) printf("chick %d try to back single and no repeat/n", iboat); tree_node *pNodeSub = new tree_node; copy_node(pNodeSub, pNodeTemp); AddSubTree(pParent, pNodeSub); pLeaf = CrossRiver(pRoot, pNodeSub, pChick); if(pLeaf!=NULL) return pLeaf; } } return pLeaf; } /* * in east how chick get up boat */ tree_node *UpBoat_East(tree_node *pRoot, tree_node *pParent, chick_character *pChick) { tree_node *pLeaf = NULL; tree_node *pNodeTemp = new tree_node; int boatIndex[BOAT_CARRY]; int numInBoat = GetNumInBoat(pParent, boatIndex); int boat_dir_new = TOWEST; switch(numInBoat) { case 0: { pLeaf = UpBoat_Empty_2(pRoot, pParent, pChick, pNodeTemp, boat_dir_new); } break; case 1: { pLeaf = UpBoat_1_1(pRoot, pParent, pChick, pNodeTemp, boat_dir_new, boatIndex[0]); } break; default: { printf("boat have two chick /n"); } } if(pLeaf==NULL) { switch(numInBoat) { case 0: { pLeaf = UpBoat_Empty_1(pRoot, pParent, pChick, pNodeTemp, boat_dir_new); } break; case 1: { //printf("chick %d can back single/n", boatIndex[0]); pLeaf = UpBoat_1_0(pRoot, pParent, pChick, pNodeTemp, boat_dir_new, boatIndex[0]); } break; default: { printf("boat have two chick /n"); } } } delete pNodeTemp; return pLeaf; } /* * in west how chick get up boat */ tree_node *UpBoat_West(tree_node *pRoot, tree_node *pParent, chick_character *pChick) { // int i, j; tree_node *pLeaf = NULL; tree_node *pNodeTemp = new tree_node; int boatIndex[BOAT_CARRY]; int numInBoat = GetNumInBoat(pParent, boatIndex); int boat_dir_new = TOEAST; // switch(numInBoat) { case 0: { pLeaf = UpBoat_Empty_1(pRoot, pParent, pChick, pNodeTemp, boat_dir_new); } break; case 1: { pLeaf = UpBoat_1_0(pRoot, pParent, pChick, pNodeTemp, boat_dir_new, boatIndex[0]); } break; default: { printf("boat have two chick /n"); } } if(pLeaf==NULL) { switch(numInBoat) { case 0: { pLeaf = UpBoat_Empty_2(pRoot, pParent, pChick, pNodeTemp, boat_dir_new); } break; case 1: { pLeaf = UpBoat_1_1(pRoot, pParent, pChick, pNodeTemp, boat_dir_new, boatIndex[0]); } break; default: { printf("boat have two chick /n"); } } } delete pNodeTemp; return pLeaf; } /* * chick get down boat as many as best */ tree_node *DownBoat(tree_node *pRoot, tree_node *pParent, chick_character *pChick) { tree_node *pLeaf = NULL; tree_node *pNodeTemp = new tree_node; //number chick in boat now and result save in boatIndex. int boatIndex[BOAT_CARRY]; int numInBoat = GetNumInBoat(pParent, boatIndex); //decide next step boat position. int boat_pos; switch(pParent->boat_dir) { case TOWEST: boat_pos= WEST; break; case TOEAST: boat_pos= EAST; break; default: printf("wrong in boat direction/n"); } // switch(numInBoat) { case 1: { //one chick down boat init_node(pNodeTemp, pParent); pNodeTemp->chick_pos[boatIndex[0]] = boat_pos; if(!IsEaten_node(pNodeTemp, pChick)) { //down boat pNodeTemp->boat_pos = boat_pos; if(!IsRepeat_node(pRoot, pNodeTemp)) { //succeed in new node tree_node *pNodeSub = new tree_node; copy_node(pNodeSub, pNodeTemp); AddSubTree(pParent, pNodeSub); pLeaf = CrossRiver(pRoot, pNodeSub, pChick); } } //another state one chick no down and back if(pLeaf==NULL) { pNodeTemp->chick_pos[boatIndex[0]] = RIVER; pNodeTemp->boat_pos = boat_pos; if(!IsRepeat_node(pRoot, pNodeTemp)) { tree_node *pNodeSub = new tree_node; copy_node(pNodeSub, pNodeTemp); AddSubTree(pParent, pNodeSub); pLeaf = CrossRiver(pRoot, pNodeSub, pChick); } } } break; case 2: { //two chick down boat init_node(pNodeTemp, pParent); pNodeTemp->chick_pos[boatIndex[0]] = boat_pos; pNodeTemp->chick_pos[boatIndex[1]] = boat_pos; if(!IsEaten_node(pNodeTemp, pChick)) { pNodeTemp->boat_pos = boat_pos; if(!IsRepeat_node(pRoot, pNodeTemp)) { tree_node *pNodeSub = new tree_node; copy_node(pNodeSub, pNodeTemp); AddSubTree(pParent, pNodeSub); pLeaf = CrossRiver(pRoot, pNodeSub, pChick); } } //one chick down boat if(pLeaf==NULL) { init_node(pNodeTemp, pParent); pNodeTemp->chick_pos[boatIndex[0]] = boat_pos; pNodeTemp->chick_pos[boatIndex[1]] = RIVER; if(!IsEaten_node(pNodeTemp, pChick)) { //下船 pNodeTemp->boat_pos = boat_pos; if(!IsRepeat_node(pRoot, pNodeTemp)) { tree_node *pNodeSub = new tree_node; copy_node(pNodeSub, pNodeTemp); AddSubTree(pParent, pNodeSub); pLeaf = CrossRiver(pRoot, pNodeSub, pChick); } } } //another one chick down boat if(pLeaf==NULL) { //没下船 init_node(pNodeTemp, pParent); pNodeTemp->chick_pos[boatIndex[0]] = RIVER; pNodeTemp->chick_pos[boatIndex[1]] = boat_pos; if(!IsEaten_node(pNodeTemp, pChick)) { //下船 pNodeTemp->boat_pos = boat_pos; if(!IsRepeat_node(pRoot, pNodeTemp)) { tree_node *pNodeSub = new tree_node; copy_node(pNodeSub, pNodeTemp); AddSubTree(pParent, pNodeSub); pLeaf = CrossRiver(pRoot, pNodeSub, pChick); } } } } break; default: printf("wrong number in boat when down %d /n", numInBoat); } delete pNodeTemp; return pLeaf; } /* * add sub tree */ void AddSubTree(tree_node* pParent, tree_node* pSubTree) { tree_node** pEnd = &pParent->pSubtree; if(*pEnd==NULL) { *pEnd = pSubTree; } else { while(*pEnd!=NULL) { pEnd = &((*pEnd)->pNext); } *pEnd = pSubTree; } } /* * is node can exist */ bool IsEaten_node(tree_node *pNode, chick_character*pChick) { int i; int relate; int boatIndex[BOAT_CARRY]; int numInBoat = GetNumInBoat(pNode, boatIndex); if(numInBoat==2) { bool bHaveBig= false; if(pChick[boatIndex[0]].type==BIG||pChick[boatIndex[1]].type==BIG) { bHaveBig = true; } if(bHaveBig) { for(int i=0; i<BOAT_CARRY; i++) { if(pChick[boatIndex[i]].type==SMALL) { relate = pChick[boatIndex[i]].relate; if(pNode->chick_pos[relate]!=RIVER) { return true; } } } } } bool bBigWest=false; //east for(i=0; i<NUMBER_CHICK; i++) { if(pNode->chick_pos[i]==WEST) { if(pChick[i].type==BIG) { bBigWest=true; break; } } } if(bBigWest) { //printf("big in west/n"); for(i=0; i<NUMBER_CHICK; i++) { if(pNode->chick_pos[i]==WEST) { if(pChick[i].type==SMALL) { relate = pChick[i].relate; if(pNode->chick_pos[relate]!=WEST) { return true; } } } } } bool bBigEast=false; //east for(i=0; i<NUMBER_CHICK; i++) { if(pNode->chick_pos[i]==EAST) { if(pChick[i].type==BIG) { bBigEast=true; break; } } } if(bBigEast) { for(i=0; i<NUMBER_CHICK; i++) { if(pNode->chick_pos[i]==EAST) { if(pChick[i].type==SMALL) { relate = pChick[i].relate; if(pNode->chick_pos[relate]!=EAST) { return true; } } } } } return false; } /* * compare two node */ BOOL Compare(tree_node *pNode1, tree_node *pNode2) { BOOL bSame=true; if(pNode1->boat_pos!=pNode2->boat_pos) { bSame = false; } else if(pNode1->boat_dir!=pNode2->boat_dir) { bSame = false; } else { for(int i=0; i<NUMBER_CHICK; i++) { if(pNode1->chick_pos[i]!=pNode2->chick_pos[i]) { bSame = false; break; } } } return bSame; } /* * is a node is repeat */ bool IsRepeat_node(tree_node *pParent, tree_node *pNode) { bool bSame=false; if(Compare(pParent, pNode)) { bSame = true; } else { tree_node **ppSubTree = &pParent->pSubtree; while(*ppSubTree!=NULL) { bSame = IsRepeat_node(*ppSubTree, pNode); if(bSame) { goto end; } //ppSubTree = &(*ppSubTree)->pSubtree; ppSubTree = &(*ppSubTree)->pNext; } } end: return bSame; } /* * get state in boat now */ int GetNumInBoat(tree_node *pNode, int *pBoatIndex) { for(int i=0; i<BOAT_CARRY; i++) { pBoatIndex[i]=-1; } int numBoat=0; for(i=0; i<NUMBER_CHICK; i++) { if(pNode->chick_pos[i]==RIVER) { pBoatIndex[numBoat] = i; numBoat++; } } return numBoat; } /* * show mid reault */ void print_node(tree_node *pParent, chick_character *pChick) { // static count=0; // printf("level=%d count=%d/n", pParent->level, count); // count++; printf("step=%d/n", pParent->level); printf("EAST:"); for(int i=0; i<NUMBER_CHICK; i++) { if(pParent->chick_pos[i]==EAST) { if(pChick[i].type==BIG) printf("id=%d BIG, ", i); else printf("id=%d SMALL, ", i); } } switch(pParent->boat_pos) { case EAST: printf("/nBOAT:"); break; case WEST: printf("/n/n/nBOAT:"); break; case RIVER: printf("/n/nBOAT:"); break; } for(i=0; i<NUMBER_CHICK; i++) { if(pParent->chick_pos[i]==RIVER) { if(pChick[i].type==BIG) printf("id=%d BIG, ", i); else printf("id=%d SMALL, ", i); } } switch(pParent->boat_pos) { case EAST: printf("/n/n/nWEST:"); break; case WEST: printf("/nWEST:"); break; case RIVER: printf("/n/nWEST:"); break; } for(i=0; i<NUMBER_CHICK; i++) { if(pParent->chick_pos[i]==WEST) { if(pChick[i].type==BIG) printf("id=%d BIG, ", i); else printf("id=%d SMALL, ", i); } } printf("/n"); switch(pParent->boat_pos) { case EAST: { printf("boat in east/n"); } break; case WEST: { printf("boat in west/n"); } break; case RIVER: { if(pParent->boat_dir==TOEAST) { printf("boat in river to east /n"); } else { printf("boat in river to west /n"); } } break; } printf("===================/n"); // getchar(); } /* * printf last reault use stack for normal order */ void print_stack(tree_node *pNode, chick_character *pChick) { using std::stack; stack <tree_node*> aStack; aStack.push(pNode); tree_node *pParent = pNode->pParent; while(pParent!=NULL) { aStack.push(pParent); pParent = pParent->pParent; } tree_node *pNodeTemp; while(!aStack.empty()) { pNodeTemp = aStack.top(); print_node(pNodeTemp, pChick); aStack.pop(); } } /* * printf last reault in reverse order */ void print_reault(tree_node *pParent, chick_character *pChick) { static int count=0; printf("===================step:%d/n", count); count++; printf("EAST:"); //if(pParent->boat_pos==EAST) printf("boat; "); for(int i=0; i<NUMBER_CHICK; i++) { if(pParent->chick_pos[i]==EAST) { if(pChick[i].type==BIG) printf("id=%d BIG, ", i); else printf("id=%d SMALL, ", i); } } printf("/nBOAT:"); //if(pParent->boat_pos==RIVER) printf("boat "); for(i=0; i<NUMBER_CHICK; i++) { if(pParent->chick_pos[i]==RIVER) { if(pChick[i].type==BIG) printf("id=%d BIG, ", i); else printf("id=%d SMALL, ", i); } } printf("/nWEST:"); //if(pParent->boat_pos==WEST) printf("boat "); for(i=0; i<NUMBER_CHICK; i++) { if(pParent->chick_pos[i]==WEST) { if(pChick[i].type==BIG) printf("id=%d BIG, ", i); else printf("id=%d SMALL, ", i); } } printf("/n"); switch(pParent->boat_pos) { case EAST: { printf("boat in east/n"); } break; case WEST: { printf("boat in west/n"); } break; case RIVER: { if(pParent->boat_dir==TOEAST) { printf("boat in river to east /n"); } else { printf("boat in river to west /n"); } } break; } printf("===================/n"); if(pParent->pParent!=NULL) print_reault(pParent->pParent, pChick); }

结果:

succeed cross river and

step=0

EAST:id=0 BIG, id=1 SMALL, id=2 BIG, id=3 SMALL, id=4 BIG, id=5 SMALL,

BOAT:

WEST:

boat in east

===================

step=1

EAST:id=2 BIG, id=3 SMALL, id=4 BIG, id=5 SMALL,

BOAT:id=0 BIG, id=1 SMALL,

WEST:

boat in river to west

===================

step=2

EAST:id=2 BIG, id=3 SMALL, id=4 BIG, id=5 SMALL,

BOAT:

WEST:id=0 BIG, id=1 SMALL,

boat in west

===================

step=3

EAST:id=2 BIG, id=3 SMALL, id=4 BIG, id=5 SMALL,

BOAT:id=0 BIG,

WEST:id=1 SMALL,

boat in river to east

===================

step=4

EAST:id=0 BIG, id=2 BIG, id=3 SMALL, id=4 BIG, id=5 SMALL,

BOAT:

WEST:id=1 SMALL,

boat in east

===================

step=5

EAST:id=0 BIG, id=4 BIG, id=5 SMALL,

BOAT:id=2 BIG, id=3 SMALL,

WEST:id=1 SMALL,

boat in river to west

===================

step=6

EAST:id=0 BIG, id=4 BIG, id=5 SMALL,

BOAT:id=2 BIG,

WEST:id=1 SMALL, id=3 SMALL,

boat in west

===================

step=7

EAST:id=0 BIG, id=4 BIG, id=5 SMALL,

BOAT:id=2 BIG,

WEST:id=1 SMALL, id=3 SMALL,

boat in river to east

===================

step=8

EAST:id=0 BIG, id=2 BIG, id=4 BIG, id=5 SMALL,

BOAT:

WEST:id=1 SMALL, id=3 SMALL,

boat in east

===================

step=9

EAST:id=4 BIG, id=5 SMALL,

BOAT:id=0 BIG, id=2 BIG,

WEST:id=1 SMALL, id=3 SMALL,

boat in river to west

===================

step=10

EAST:id=4 BIG, id=5 SMALL,

BOAT:

WEST:id=0 BIG, id=1 SMALL, id=2 BIG, id=3 SMALL,

boat in west

===================

step=11

EAST:id=4 BIG, id=5 SMALL,

BOAT:id=1 SMALL,

WEST:id=0 BIG, id=2 BIG, id=3 SMALL,

boat in river to east

===================

step=12

EAST:id=4 BIG, id=5 SMALL,

BOAT:id=1 SMALL,

WEST:id=0 BIG, id=2 BIG, id=3 SMALL,

boat in east

===================

step=13

EAST:id=4 BIG, id=5 SMALL,

BOAT:id=1 SMALL,

WEST:id=0 BIG, id=2 BIG, id=3 SMALL,

boat in river to west

===================

step=14

EAST:id=4 BIG, id=5 SMALL,

BOAT:id=1 SMALL,

WEST:id=0 BIG, id=2 BIG, id=3 SMALL,

boat in west

===================

step=15

EAST:id=4 BIG, id=5 SMALL,

BOAT:id=0 BIG, id=1 SMALL,

WEST:id=2 BIG, id=3 SMALL,

boat in river to east

===================

step=16

EAST:id=0 BIG, id=1 SMALL, id=4 BIG, id=5 SMALL,

BOAT:

WEST:id=2 BIG, id=3 SMALL,

boat in east

===================

step=17

EAST:id=1 SMALL, id=5 SMALL,

BOAT:id=0 BIG, id=4 BIG,

WEST:id=2 BIG, id=3 SMALL,

boat in river to west

===================

step=18

EAST:id=1 SMALL, id=5 SMALL,

BOAT:

WEST:id=0 BIG, id=2 BIG, id=3 SMALL, id=4 BIG,

boat in west

===================

step=19

EAST:id=1 SMALL, id=5 SMALL,

BOAT:id=0 BIG,

WEST:id=2 BIG, id=3 SMALL, id=4 BIG,

boat in river to east

===================

step=20

EAST:id=1 SMALL, id=5 SMALL,

BOAT:id=0 BIG,

WEST:id=2 BIG, id=3 SMALL, id=4 BIG,

boat in east

===================

step=21

EAST:id=5 SMALL,

BOAT:id=0 BIG, id=1 SMALL,

WEST:id=2 BIG, id=3 SMALL, id=4 BIG,

boat in river to west

===================

step=22

EAST:id=5 SMALL,

BOAT:

WEST:id=0 BIG, id=1 SMALL, id=2 BIG, id=3 SMALL, id=4 BIG,

boat in west

===================

step=23

EAST:id=5 SMALL,

BOAT:id=1 SMALL,

WEST:id=0 BIG, id=2 BIG, id=3 SMALL, id=4 BIG,

boat in river to east

===================

step=24

EAST:id=1 SMALL, id=5 SMALL,

BOAT:

WEST:id=0 BIG, id=2 BIG, id=3 SMALL, id=4 BIG,

boat in east

===================

step=25

EAST:

BOAT:id=1 SMALL, id=5 SMALL,

WEST:id=0 BIG, id=2 BIG, id=3 SMALL, id=4 BIG,

boat in river to west

===================

step=26

EAST:

BOAT:

WEST:id=0 BIG, id=1 SMALL, id=2 BIG, id=3 SMALL, id=4 BIG, id=5 SMALL,

boat in west

===================

关于三只母鸡和三只小鸡过河问题相关推荐

  1. C语言:一只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱,现在要用百钱买百鸡,请问公鸡、母鸡、小鸡各多少只?

    一.分析问题 一只公鸡五块钱--最多买20只(cock) 一只母鸡三块钱--最多买33只(hen) 三只小鸡一块钱--最多买100只(chicken) 我们只需要找到1.cock+hen+chicke ...

  2. 2.4 百钱买百鸡:一只公鸡5钱,一只母鸡3钱,小鸡1钱3只。今有百钱买鸡百只,问公鸡、母鸡、小鸡各几只。

    #include<stdio.h> int main(){for(int x=0;x<=100;x++){for(int y=0;y<=100;y++){for(int z=0 ...

  3. 中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱百鸡问题”:一只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱,现在要用百钱买百鸡,请问公鸡,母鸡,小鸡各多少只?

    问题分析 (1)用百钱如果只买公鸡,最多可以买20只,但题目要求买一百只,由此可知,所买公鸡的数量应该在0~20之间. (2)同理,所买母鸡的数量应该在0~33之间. (3)不妨把公鸡,母鸡和小鸡的数 ...

  4. 要求用 100 元买 100 只鸡,其中公鸡五元一只,母鸡三元一只,小鸡 1 元三只,规定每种至少买一 只

    要求用 100 元买 100 只鸡,其中公鸡五元一只,母鸡三元一只,小鸡 1 元三只,规定每种至少买一 只 public static void main(String[] args) {for(in ...

  5. 【百元钱买百只鸡问题】一只公鸡5元钱,一只母鸡3元钱,三只小鸡1元钱。要求100元买100只鸡,请给出所有可行的结果?

    public class Ji {public static void main(String[] agrs) {//(百元钱买百只鸡问题)一只公鸡5元钱,一只母鸡3元钱,三只小鸡1元钱//要求100 ...

  6. python——百钱买百鸡:一只公鸡5块钱,一只母鸡3块钱,三只小鸡1块钱,现在要用一百块钱买一百只鸡,问公鸡、母鸡、小鸡各多少只?

      学习<python程序设计教程>的时候,遇到了这个问题,觉得还蛮好玩的: 百钱买百鸡:一只公鸡5块钱,一只母鸡3块钱,三只小鸡1块钱,现在要用一百块钱买一百只鸡,问公鸡.母鸡.小鸡各多 ...

  7. 124-Python_百钱买百鸡:一只公鸡5 元钱,一只母鸡 3 元钱三只小鸡1元钱现在要用 100 元钱买 100 只鸡,问公鸡、母鸡、小鸡各多少只?请利用列表推导式解决该问题。

    百钱买百鸡:一只公鸡5 元钱,一只母鸡 3 元钱三只小鸡1元钱现在要用 100 元钱买 100 只鸡,问公鸡.母鸡.小鸡各多少只?请利用列表推导式解决该问题. lst = [(x, y, 100-x- ...

  8. 2.(C语言)百钱白鸡问题:100元钱买100只鸡,公鸡一只5元钱,母鸡一只3元钱,小鸡一元钱三只,求100元钱能买公鸡、母鸡、小鸡各多少只?

    思路:母鸡和公鸡很好理解,主要是小鸡要绕下脑子,用100-母鸡-公鸡 =小鸡. 一定要除以3.0 不然 他会  舍去或者加上1 答案就不正确了. ps:感谢大佬提醒 刚学不久 希望多多指导 谢谢 #i ...

  9. 算法:买小鸡,公鸡2元,母鸡3元,小鸡0.3,要求:100元 ,买100只鸡可以有剩余

    博客来源: 闲来无聊,感觉脑子最近不在状态,忙里偷闲刷刷算法,不过好久没用的脑子有点不够灵活,遇到一道买东西的题,不过感觉发挥并不好,后续有时间完善更好的方法 话不多说,直接给出代码吧 /*** 买小 ...

最新文章

  1. ceph bluestore源码分析:非对齐写逻辑
  2. SpringBoot之配置嵌入式Servlet容器
  3. SAP RETAIL 我的第一个寄售类型的跨公司采购订单
  4. Struts2_day02--封装数据到集合里面
  5. linux推出超级用户_Linux 系统的进入与退出
  6. 48万!百度推出全球最便宜RoboTaxi,赚钱能力2倍于人类网约车
  7. 分布式系统的那些事儿(六) - SOA架构体系
  8. tensorflow分类的loss函数_tensorflow 分类损失函数使用小记
  9. 配置文件上传的Action
  10. 70. Climbing Stairs 题解
  11. JS 浏览器关闭事件
  12. [Django]Windows下的Django安装——通过pip
  13. opencv android模版匹配,基于opencv模板匹配的目标检测方法
  14. cad安装日志文件发生错误_cad安装出现错误 - 卡饭网
  15. 储存卡格式化怎么恢复?给力的操作!
  16. 两步免费开通企业微信,不用提交资料
  17. 《迫在眉梢》英文名《John Q》经典台词
  18. 职场礼仪_举止_坐姿
  19. 像差分析(更新。。。)
  20. python子进程kerberos_Python实现Kerberos用户的增删改查操作

热门文章

  1. NHK Easy News 翻译 12月19日
  2. 马云与马化腾的疫情对决:一场“文科生”与“理工男”的较量
  3. 51单片机驱动1602液晶显示器c程序---万年历
  4. 生产力 生产关系 生产工具_我的9个最喜欢的生产力工具
  5. VMware NAT 端口映射
  6. springboot整合quartz实现动态添加、修改、删除、停止job,以及优化quartz工具类,支持自动停止逻辑
  7. 小额贷款机构该如何引入大数据
  8. 一台计算机可以安装多台打印机吗,一台打印机这样设置可以让多台电脑进行共享打印...
  9. c语言输出汉字字符串,c语言怎么输出字符串
  10. sgw音视频开发面试(转)