內容:
古戈爾博士邊觀賞電視影集<星艦迷航記>,邊想出了這個驚悚的謎題。克林貢市是一個數字棋盤,在那裡生活艱困。每個克林貢人都攜帶著炸彈在臀部,以證明他的勇氣。克林貢人走在棋盤方格上時,每接觸一個數字,他的炸彈就會收到一組信號;如果又碰到同一個數字,炸彈就會爆炸,把那位克林貢人炸死。克林貢人都是勇敢的戰士,從不面露恐懼—實際上,他們酷愛挑戰這種殘忍的遊戲。
克林貢人可以在貢林市的任意方格上走動,他們可以上下左右移動,但不能走斜角。克林貢人可以活著走多遠的路途?請記住,克林貢人必須避開先前碰過的數字,否則他就會爆炸。
為簡單起見,我們限制克林貢人在選擇移動的順序,必須「向右、向左、向下、向上」的順序去尋找活路。譬如向右走是活路,就直接向右走,之後再繼續同樣的順序作選擇;如果向右走是會爆炸的話,接下來就看向左會不會爆炸,以此類推。
從一個檔案讀入 8x8 的數字,每個數字代表 8x8 的方格中的數字。以程式去判斷,克林貢人該怎麼走的路徑(需按題目的限制去作選擇),才會活著走最遠。把路徑經過的數字依序印出。
範例輸入:
0 0 2 21 2 23 15 18 4 22 24 17 12 4 11 19 3 3 11 15 5 12 6 8 18 23 6 12 18 24 15 11 9 7 19 18 16 18 14 18 2 17 10 6 5 7 20 7 5 24 5 24 18 0 1 3 24 21 6 8 21 23 18 13
但我覺得很怪(1,2)的0明明就起點走過怎可以從那走
所以我的輸出不一樣 是從0>4>22.....這樣走的
而且排版也改了一下
範例輸出:
原本:0 2 21 17 12 4 11 19 8 6 15 24 18 16 5 7 20 1 3 13
修正:[0, 4, 22, 24, 17, 12, 5, 15, 11, 3, 23, 6, 19, 18, 16]
可改進的地方:
1.因為switch case後面只能接常數 所以我程式寫死了 用if else太麻煩 要判斷很多 覺得code會更難閱讀 不然的話想 讓他地圖寬度有變化
2.最後想把他印出走過的MAP(走過的點用其他圖案代替)但是因為我是short陣列所以不能用其他圖案
如果想修改可以改成char or String array
Created with colorer-take5 library. Type 'java' import java.util.ArrayList; import java.util.Scanner; public class d018 { static int size=64; //所有棋盤 static short [] arrayShort =new short[]{0,0,2,21,2,23,15,18, 4,22,24,17,12,4,11,19, 3,3,11,15,5,12,6,8, 18,23,6,12,18,24,15,11, 9,7,19,18,16,18,14,18, 2,17,10,6,5,7,20,7, 5,24,5,24,18,0,1,3, 24,21,6,8,21,23,18,13}; //放走過的數字 static ArrayList<Short> passShort =new ArrayList<Short>(); //地圖寬度 static int Width; public static void main(String[] args) { d018 d=new d018(); int Currently=0;//放目前走到的位置,預設為arrayShort[0] passShort.add(arrayShort[0]); /*使用者輸入區塊 Scanner scan =new Scanner(System.in); System.out.println("Please enter Map(8*8):"); for(int x=0;x<size;x++){ arrayShort[x]=scan.nextShort(); }*/ Width=(int)Math.sqrt(arrayShort.length);//取得地圖寬度 d.PrintMap(arrayShort);//呼叫PrintMap函式印出地圖 //System.out.println(arrayShort[0]);//先印出起點 while(1==1){ Currently=d.judge(Currently); if(Currently==-1) break; passShort.add(arrayShort[Currently]);//把走過的座標存入passShort內 //System.out.println(arrayShort[Currently]); } System.out.println("走的路徑為 :"+passShort); } //印出地圖 public void PrintMap(short[] shortArray){ System.out.println("地圖為:"); for(int count=0;count<arrayShort.length;count++){ System.out.print(shortArray[count]); if(shortArray[count]<10){ System.out.print(" "); }else{ System.out.print(" "); } if(count%Width==(Width-1)) System.out.println(); } } //傳入一所在座標如果有路傳回下一所在座標,沒路回傳-1告知已走到盡頭 public int judge(int index){ switch(index){ case 0://左上角 if(passShort.indexOf(arrayShort[1])==-1){//0右邊並沒有被走過 return 1; }else if(passShort.indexOf(arrayShort[8])==-1){//0下面並沒有走過 return 8; }else{//左下都被走過的話則本地為最後座標 return -1; } case 7://右上角 if(passShort.indexOf(arrayShort[6])==-1){//7左邊並沒有被走過 return 6; }else if(passShort.indexOf(arrayShort[15])==-1){//7下面並沒有走過 return 15; }else{//左下都被走過的話則本地為最後座標 return -1; } case 56://左下角 if(passShort.indexOf(arrayShort[57])==-1){//56右邊並沒有被走過 return 57; }else if(passShort.indexOf(arrayShort[48])==-1){//56上面並沒有走過 return 48; }else{//上右都被走過的話則本地為最後座標 return -1; } case 63://右下角 if(passShort.indexOf(arrayShort[62])==-1){//63左邊並沒有被走過 return 62; }else if(passShort.indexOf(arrayShort[55])==-1){//63上面並沒有走過 return 55; }else{//左上都被走過的話則本地為最後座標 return -1; } default: if(index>0&&index<7){//上排 if(passShort.indexOf(arrayShort[index+1])==-1){//右邊並沒有被走過 return index+1; }else if(passShort.indexOf(arrayShort[index-1])==-1){//左邊並沒有走過 return index-1; }else if(passShort.indexOf(arrayShort[index+8])==-1){//下面並沒有走過 return index+8; }else{//都被走過的話則本地為最後座標 return -1; } }else if((index>=8&&index<=48)&&(index%8==0)){//左排 if(passShort.indexOf(arrayShort[index+1])==-1){//右邊並沒有被走過 return index+1; }else if(passShort.indexOf(arrayShort[index+8])==-1){//下面並沒有走過 return index+8; }else if(passShort.indexOf(arrayShort[index-8])==-1){//上面並沒有走過 return index-8; }else{//都被走過的話則本地為最後座標 return -1; } }else if((index>=15&&index<=55)&&(index%8==7)){//右排 if(passShort.indexOf(arrayShort[index-1])==-1){//左邊並沒有被走過 return index-1; }else if(passShort.indexOf(arrayShort[index+8])==-1){//下面並沒有走過 return index+8; }else if(passShort.indexOf(arrayShort[index-8])==-1){//上面並沒有走過 return index-8; }else{//都被走過的話則本地為最後座標 return -1; } }else if(index>56&&index<63){//下排 if(passShort.indexOf(arrayShort[index+1])==-1){//右邊並沒有被走過 return index+1; }else if(passShort.indexOf(arrayShort[index-1])==-1){//左邊並沒有走過 return index-1; }else if(passShort.indexOf(arrayShort[index-8])==-1){//上面並沒有走過 return index-8; }else{//都被走過的話則本地為最後座標 return -1; } }else{//裡面 if(passShort.indexOf(arrayShort[index+1])==-1){//右邊並沒有被走過 return index+1; }else if(passShort.indexOf(arrayShort[index-1])==-1){//左邊並沒有走過 return index-1; }else if(passShort.indexOf(arrayShort[index+8])==-1){//下面並沒有走過 return index+8; }else if(passShort.indexOf(arrayShort[index-8])==-1){//上面並沒有走過 return index-8; }else{//都被走過的話則本地為最後座標 return -1; } } } } }
文章標籤
全站熱搜