一、題目描述
一家六口,一個爸爸,一個媽媽,倆兒子,倆女兒,還有一個警察,一個壞蛋,過一條河,爸爸不在媽媽傷害兒子,媽媽不在爸爸傷害女兒,警察不在壞蛋傷害一家六口,只有媽媽爸爸警察會開船,一次只能過兩個人,只有一艘船。 爲怎樣過河才能使他們安全度過
二、大腦解題思路
我們當然是一個一個試試啦,百度百科解題如下
三、程序解題
其實人解這道題和計算機解答是一樣的,就是往過一個一個的試試,只不過是人的思維太活躍的一時半會找不到思考順序的規律,捋一捋就清楚了,下面是java代碼 (複製即可運行)
public class Test { //1 1 1 1 1 1 1 1 //警察犯人爸爸 媽媽 男1 男2 女1 女2 public static int[] c = new int[]{0,2,3}; public static void main(String[] args) { //a,b兩個數組,a代表河這邊的人存在爲1,不存在爲0,本來一組就可以了,但是河對岸的人還要往過來走 //記錄河對岸的測試情況,所以採用兩個數組 int[] a = new int[]{1,1,1,1,1,1,1,1}; int[] b = new int[]{0,0,0,0,0,0,0,0}; Boat(a, b,-1,-1); } //將題的條件理出來,判斷是否方法可行 public static boolean ifsuccess(int a[],int b[]){ if(a[0]==0&&a[1]==1){ for(int i=2;i<8;i++){ if(a[i]>0){ return false; } } } if(a[2]==1){ if(a[3]!=1){ for(int i=6;i<8;i++){ if(a[i]==1){ return false; } } } } if(a[3]==1){ if(a[2]!=1){ for(int i=4;i<6;i++){ if(a[i]==1){ return false; } } } } if(b[0]==0&&b[1]==1){ for(int i=2;i<8;i++){ if(b[i]>0){ return false; } } } if(b[2]==1){ if(b[3]!=1){ for(int i=6;i<8;i++){ if(b[i]==1){ return false; } } } } if(b[3]==1){ if(b[2]!=1){ for(int i=4;i<6;i++){ if(b[i]==1){ return false; } } } } return true; } //河這邊的往過走 public static void Boat(int a[],int b[],int a1,int b1){ System.out.println("--------"); for(int i = 0;i<3;i++){ if(a[c[i]]!=0){ a[c[i]]=0; b[c[i]]=1; for(int j=0;j<8;j++){ if(a[j]!=0&&(c[i]!=a1||j!=b1)&&(c[i]!=b1||j!=a1)){ a[j]=0; b[j]=1; //如果滿足條件就開始從河對岸往回走 if(ifsuccess(a, b)){ print(a, b); Boatreturn(a, b,c[i],j); } //不成功繼續判斷,回溯 a[j]=1; b[j]=0; } } a[c[i]]=1; b[c[i]]=0; } } return; } public static void Boatreturn(int a[],int b[],int a1,int b1){ for(int i = 0;i<3;i++){ if(b[c[i]]!=0){ b[c[i]]=0; a[c[i]]=1; if(ifsuccess(a, b)){ print(a, b); Boat(a, b,c[i],-1); } for(int j=0;j<8;j++){ if(b[j]!=0&&(c[i]!=a1||j!=b1)&&(c[i]!=b1||j!=a1)){ b[j]=0; a[j]=1; if(ifsuccess(a, b)){ print(a, b); Boat(a, b,c[i],j); } b[j]=1; a[j]=0; } } b[c[i]]=1; a[c[i]]=0; } } return; } public static void print(int a[],int b[]){ //判斷是否全部過河 int flag = 0; for (int i : a) { if(i==0) flag++; } for (int i : b) { System.out.print(i); } if(flag==8){ System.out.println("成功---------"); for (int i = 0; i < b.length; i++) { b[i]=0; } for (int i = 0; i < a.length; i++) { a[i]=1; } } System.out.println(); } }
程序運行只出現一種對的結果,答案是一種以上,如果有什麼好的想法或方法可以一起留言討論