import?java.util.Arrays;
創(chuàng)新互聯(lián)公司長期為1000多家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為迎江企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì),迎江網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
import?java.util.List;
import?java.util.Stack;
public?class?Monkey?{
public?String[]?monkeys?=?{?"a",?"b",?"c",?"A",?"B",?"C"?};
Rule?rule1?=?new?Rule1();
Rule?rule2?=?new?Rule2();
public?int?count?=?0;
public?StringBuffer?success?=?new?StringBuffer(2000);
public?void?boat()?{
StackString?left?=?new?StackString();
StackString?right?=?new?StackString();
for?(int?i?=?0;?i??monkeys.length;?i++)?{
left.add(monkeys[i]);
}
go(left,?right,?"");
System.out.println("***********************共"?+?count?+?"種成功方案***********************");
System.out.println(success.toString());
System.out.println("***********************共"?+?count?+?"種成功方案***********************");
}
private?void?go(StackString?left,?StackString?right,?String?s)?{
for?(int?i?=?0;?i??left.size();?i++)?{
String?monkey1?=?left.get(i);
for?(int?j?=?i?+?1;?j??left.size();?j++)?{
StringBuffer?sb?=?new?StringBuffer();
String?monkey2?=?left.get(j);
sb.append(s);
sb.append(monkey1);
sb.append(monkey2);
sb.append("-");
sb.append("?");
if?((rule1.isCanBoat(monkey1,?monkey2,?sb))??(rule2.isCanBoat(monkey1,?monkey2,?sb)))?{
StackString?nextLeft?=?new?StackString();
StackString?nextRight?=?new?StackString();
nextLeft.addAll(left);
nextRight.addAll(right);
nextLeft.remove(monkey1);
nextLeft.remove(monkey2);
nextRight.push(monkey1);
nextRight.push(monkey2);
if?(nextLeft.size()?==?0)?{
success.append(sb.toString()?+?nextLeft.toString()?+?nextRight.toString());
success.append("\n");
count++;
continue;
}
back(nextLeft,?nextRight,?sb.toString());
}
}
}
}
private?void?back(StackString?left,?StackString?right,?String?s)?{
for?(int?i?=?0;?i??right.size();?i++)?{
String?monkey1?=?right.get(i);
StringBuffer?sb?=?new?StringBuffer();
sb.append(s);
sb.append(monkey1);
sb.append("-");
sb.append("?");
if?(rule2.isCanBoat(monkey1,?monkey1,?sb))?{
StackString?nextLeft?=?new?StackString();
StackString?nextRight?=?new?StackString();
nextLeft.addAll(left);
nextRight.addAll(right);
nextLeft.push(monkey1);
nextRight.remove(monkey1);
go(nextLeft,?nextRight,?sb.toString());
}
}
}
public?static?void?main(String[]?args)?{
Monkey?monkey?=?new?Monkey();
monkey.boat();
}
}
interface?Rule?{
boolean?isCanBoat(String?m1,?String?m2,?StringBuffer?sb);
}
class?Rule1?implements?Rule?{
String[]?childMonkeys?=?{?"a",?"b",?"c"?};
String[]?monkeys?=?{?"A",?"B",?"C"?};
public?boolean?isCanBoat(String?m1,?String?m2,?StringBuffer?sb)?{
if?(m1.toLowerCase().equals(m2.toLowerCase()))?{
return?true;
}
ListString?childMonkeysList?=?Arrays.asList(childMonkeys);
ListString?monkeysList?=?Arrays.asList(monkeys);
if?((monkeysList.contains(m1)??monkeysList.contains(m2))
||?(childMonkeysList.contains(m1)??childMonkeysList.contains(m2)))?{
return?true;
}
sb.append("大猴欺負(fù)小猴!");
System.out.println(sb.toString());
return?false;
}
}
class?Rule2?implements?Rule?{
String[]?smartMonkeys?=?{?"A",?"B",?"C",?"a"?};
public?boolean?isCanBoat(String?m1,?String?m2,?StringBuffer?sb)?{
ListString?smartMonkeysList?=?Arrays.asList(smartMonkeys);
if?(smartMonkeysList.contains(m1)?||?smartMonkeysList.contains(m2))?{
return?true;
}
sb.append("沒有會劃船的猴子!");
System.out.println(sb.toString());
return?false;
}
}
六種動物過河,是大小虎,大小豹,大小熊,大熊大獅大虎小熊會劃船,只有一只船并且一次只能載兩只動物,注意,小的旁邊如果有其他大的而沒有自己大的就會被欺負(fù)(大不吃大,小不吃小),怎么能使它們?nèi)^河?(最好有原代碼提供,謝了~~)
附:
猛獸過河的過程為:
第一步:小熊和小虎過去————小雄回來送船
第二步:小熊和小豹過去————小熊回來送船
第三步:大豹子和大虎過去————大虎和小虎送船
第四步:小熊和大熊過去--------大豹和小豹回來送船
第五步:大豹和大虎過去-------小熊回來送船
第六步:小熊和小虎過去---------小熊回來
第七步:小熊和小豹過去
微軟的一條面試題(和猛獸過河問題很相似,供參考):
三只母雞,三只小雞在河?xùn)|岸,一條小舟每次最多載兩只雞(大小不論)。
條件:
1、母雞都會劃船。
2、只有一只小雞會劃船,其余兩只不會。
3、當(dāng)小雞母親不在身邊時,其余母雞就會啄死這只小雞。
其算法為:
int 過河前數(shù)組,把雞放進(jìn)去
int 過河后數(shù)組
再定義一個結(jié)構(gòu)
{雞1;
雞2;
int *pnext;
}
及結(jié)構(gòu)指針
結(jié)構(gòu)指針開辟內(nèi)存
void 過河(過河前數(shù)組,過河后數(shù)組,結(jié)構(gòu)指針)
{if(過河前數(shù)組全為0)
{輸出鏈表中的內(nèi)容
return;
}
else
{ int i,j,m,n;
int temp過河前數(shù)組;
int temp過河后數(shù)組;
temp過河前數(shù)組=過河前數(shù)組;
temp過河后數(shù)組=過河后數(shù)組
for(i=0;i上標(biāo)-1;i++)
for(j=i+1;j上標(biāo);j++)
{m=過河前數(shù)組[i];
n=過河前數(shù)組[j];
if(判取出兩個數(shù)后剩下的數(shù)及這兩個數(shù)滿足過河條件別忘了判這兩個數(shù)與過河后數(shù)組滿不滿足)
{把m,n放入結(jié)構(gòu);
if(判結(jié)構(gòu)指針中的pnext是否為null)
是結(jié)構(gòu)指針開辟內(nèi)存 形成新結(jié)構(gòu)組成鏈表;
否就把指針向下移;
把m,n放入temp過河后數(shù)組
temp過河前數(shù)組中把m,n變?yōu)?;
回河(temp過河前數(shù)組,temp過河后數(shù)組,結(jié)構(gòu)指針);
}
}
}
}
void 回河(過河前數(shù)組,過河后數(shù)組,結(jié)構(gòu)指針)
{int i,j,m,n;
int temp過河前數(shù)組;
int temp過河后數(shù)組;
int temp結(jié)構(gòu)指針=結(jié)構(gòu)指針;
temp過河前數(shù)組=過河前數(shù)組;
temp過河后數(shù)組=過河后數(shù)組;
for(i=0;i上標(biāo)-1;i++)
for(j=i+1;j上標(biāo);j++)
{m=過河后數(shù)組[i];
n=過河后數(shù)組[j];
if(判取出2個數(shù)后剩下的數(shù)及這兩個數(shù)滿足回河條件別忘了判這2個數(shù)與過河前數(shù)組滿不滿足)
{把m,n放入結(jié)構(gòu);
if(判結(jié)構(gòu)指針中的pnext是否為null)
是開辟內(nèi)存 形成新結(jié)構(gòu)組成鏈表;
否就把指針向下移;
把m,n放入temp過河前數(shù)組
temp過河后數(shù)組中把m,n變?yōu)?;
過河(temp過河前數(shù)組,temp過河后數(shù)組,結(jié)構(gòu)指針);
}
}
temp過河前數(shù)組=過河前數(shù)組;
temp過河后數(shù)組=過河后數(shù)組;
for(i=0;i上標(biāo)-1;i++)
{m=過河后數(shù)組[i];
if(判取出1個數(shù)后剩下的數(shù)及這1個數(shù)滿足回河條件別忘了判這1個數(shù)與過河前數(shù)組滿不滿足)
{if(判temp結(jié)構(gòu)指針中的pnext是否為null)
是開辟內(nèi)存 形成新結(jié)構(gòu)組成鏈表;
否就把指針向下移;
把m放入temp過河前數(shù)組
temp過河后數(shù)組中把m變?yōu)?;
過河(temp過河前數(shù)組,temp過河后數(shù)組,temp結(jié)構(gòu)指針);
}
}
急求?。?!
//CrossRiverQuestion.java
import?java.util.ArrayList;
import?java.util.List;
public?class?CrossRiverQuestion?{
public?static?void?main(String[]?args)?{
CrossRiverQuestion?q?=?new?CrossRiverQuestion(5,?4);
q.solveQuestion();
}
private?int?peoNum;
private?int?savageNum;
private?ListNode?resultList?=?new?ArrayListNode();
public?ListNode?solveQuestion()?{
Node?n?=?new?Node(peoNum,savageNum,0,0,0,new?ArrayListInteger(),0,0);
boolean?dfsResult?=?dfs(n);
if(dfsResult)?{
resultList.add(0,n);
for(Node?node?:?resultList)?{
System.out.println("左岸傳教士:"+node.getLeftPeo()+"左岸野人:?"+node.getLeftSavage()+"?右岸傳教士:?"+node.getRightPeo()+"右岸野人:"+node.getRightSavage()+"船上傳教士:"+node.getOnBoatPeoNum()+"船上野人:"+node.getOnBoatSavageNum());
}
return?resultList;
}
return?null;
}
public?CrossRiverQuestion(int?peoNum,?int?savageNum)?{
super();
this.peoNum?=?peoNum;
this.savageNum?=?savageNum;
}
private?boolean?dfs(Node?n)?{
if(n.hasVisited())?return?false;
n.addCheckSum();
if(n.getLeftPeo()==0n.getLeftSavage()==0)?return?true;
if(n.getLeftPeo()0||n.getRightPeo()0||n.getLeftSavage()0||n.getRightSavage()0)?{
return?false;
}
if(n.getLeftPeo()n.getLeftSavage()n.getLeftPeo()0)?return?false;
if(n.getRightPeo()n.getRightSavage()n.getRightPeo()0)?return?false;
if(n.getCURR_STATE()==n.getStateBoatLeft())?{
Node?n1?=?new?Node(n.getLeftPeo()-1,n.getLeftSavage()-1,n.getRightPeo()+1,n.getRightSavage()+1,n.getStateBoatRight(),n.getNodesCheckSum(),1,1);
if(dfs(n1))?{
resultList.add(0,n1);
return?true;
}
Node?n4?=?new?Node(n.getLeftPeo()-2,n.getLeftSavage(),n.getRightPeo()+2,n.getRightSavage(),n.getStateBoatRight(),n.getNodesCheckSum(),2,0);
if(dfs(n4))?{
resultList.add(0,n4);
return?true;
}
Node?n5?=?new?Node(n.getLeftPeo(),n.getLeftSavage()-2,n.getRightPeo(),n.getRightSavage()+2,n.getStateBoatRight(),n.getNodesCheckSum(),0,2);
if(dfs(n5))??{
resultList.add(0,n5);
return?true;
}
}?
else?{
Node?n6?=?new?Node(n.getLeftPeo(),n.getLeftSavage()+1,n.getRightPeo(),n.getRightSavage()-1,n.getStateBoatLeft(),n.getNodesCheckSum(),0,1);
if(dfs(n6))?{
resultList.add(0,n6);
return?true;
}
Node?n7?=?new?Node(n.getLeftPeo()+1,n.getLeftSavage(),n.getRightPeo()-1,n.getRightSavage(),n.getStateBoatLeft(),n.getNodesCheckSum(),1,0);
if(dfs(n7))?{
resultList.add(0,n7);
return?true;
}
Node?n1?=?new?Node(n.getLeftPeo()+1,n.getLeftSavage()+1,n.getRightPeo()-1,n.getRightSavage()-1,n.getStateBoatLeft(),n.getNodesCheckSum(),1,1);
if(dfs(n1))?{
resultList.add(0,n1);
return?true;
}
Node?n4?=?new?Node(n.getLeftPeo()+2,n.getLeftSavage(),n.getRightPeo()-2,n.getRightSavage(),n.getStateBoatLeft(),n.getNodesCheckSum(),2,0);
if(dfs(n4))?{
resultList.add(0,n4);
return?true;
}
Node?n5?=?new?Node(n.getLeftPeo(),n.getLeftSavage()+2,n.getRightPeo(),n.getRightSavage()-2,n.getStateBoatLeft(),n.getNodesCheckSum(),0,2);
if(dfs(n5))??{
resultList.add(0,n5);
return?true;
}
}
return?false;
}
public?ListNode?getResultList()?{
return?resultList;
}
}
Node.java
import?java.util.ArrayList;
import?java.util.List;
public?class?Node?{
private?ListInteger?nodesCheckSum?=?new?ArrayListInteger();
private?int?leftPeo;
private?int?rightPeo;
private?int?leftSavage;
private?int?rightSavage;
private?int?CURR_STATE?=?0;
private?int?onBoatPeoNum?=?0;
private?int?onBoatSavageNum?=?0;
private?final?int?STATE_BOAT_LEFT?=?0;
private?final?int?STATE_BOAT_RIGHT?=?1;
public?Node(int?leftPeo,?int?leftSavage,?int?rightPeo,?int?rightSavage,?int?state,?List?checkSumList,?int?onBoatPeoNum,?int?onBoatSavageNum)?{
this.CURR_STATE?=?state;
this.leftPeo?=?leftPeo;
this.leftSavage?=?leftSavage;
this.rightPeo?=?rightPeo;
this.rightSavage?=?rightSavage;
this.nodesCheckSum.addAll(checkSumList);
this.onBoatPeoNum?=?onBoatPeoNum;
this.onBoatSavageNum?=?onBoatSavageNum;
}
public?int?getLeftPeo()?{
return?leftPeo;
}
public?void?setLeftPeo(int?leftPeo)?{
this.leftPeo?=?leftPeo;
}
public?int?getRightPeo()?{
return?rightPeo;
}
public?void?setRightPeo(int?rightPeo)?{
this.rightPeo?=?rightPeo;
}
public?int?getLeftSavage()?{
return?leftSavage;
}
public?void?setLeftSavage(int?leftSavage)?{
this.leftSavage?=?leftSavage;
}
public?int?getRightSavage()?{
return?rightSavage;
}
public?void?setRightSavage(int?rightSavage)?{
this.rightSavage?=?rightSavage;
}
@Override
public?String?toString()?{
return?leftPeo+","+leftSavage+","+rightPeo+","+rightSavage+","+CURR_STATE;
}
public?int?getCURR_STATE()?{
return?CURR_STATE;
}
public?void?setCURR_STATE(int?cURR_STATE)?{
CURR_STATE?=?cURR_STATE;
}
public?int?getStateBoatLeft()?{
return?STATE_BOAT_LEFT;
}
public?int?getStateBoatRight()?{
return?STATE_BOAT_RIGHT;
}
public?int?calcCheckSum()?{
return?1*getCURR_STATE()+10*getLeftPeo()+100*getLeftSavage()+1000*getRightPeo()+10000*getRightSavage();
}
public?void?addCheckSum()?{
int?checkSum?=?calcCheckSum();
nodesCheckSum.add(checkSum);
}
public?boolean?hasVisited()?{
int?sum?=?calcCheckSum();
for?(Integer?checkSum?:?nodesCheckSum)?{
if(checkSum==sum)?return?true;
}
return?false;
}
public?ListInteger?getNodesCheckSum()?{
return?nodesCheckSum;
}
public?int?getOnBoatPeoNum()?{
return?onBoatPeoNum;
}
public?void?setOnBoatPeoNum(int?onBoatPeoNum)?{
this.onBoatPeoNum?=?onBoatPeoNum;
}
public?int?getOnBoatSavageNum()?{
return?onBoatSavageNum;
}
public?void?setOnBoatSavageNum(int?onBoatSavageNum)?{
this.onBoatSavageNum?=?onBoatSavageNum;
}
}
文章標(biāo)題:魔法師過河java代碼 魔法師過河java代碼怎么寫
當(dāng)前URL:http://bm7419.com/article26/dohjicg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊、網(wǎng)站導(dǎo)航、、自適應(yīng)網(wǎng)站、全網(wǎng)營銷推廣、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)