內容:

古戈爾博士邊觀賞電視影集<星艦迷航記>,邊想出了這個驚悚的謎題。克林貢市是一個數字棋盤,在那裡生活艱困。每個克林貢人都攜帶著炸彈在臀部,以證明他的勇氣。克林貢人走在棋盤方格上時,每接觸一個數字,他的炸彈就會收到一組信號;如果又碰到同一個數字,炸彈就會爆炸,把那位克林貢人炸死。克林貢人都是勇敢的戰士,從不面露恐懼—實際上,他們酷愛挑戰這種殘忍的遊戲。

克林貢人可以在貢林市的任意方格上走動,他們可以上下左右移動,但不能走斜角。克林貢人可以活著走多遠的路途?請記住,克林貢人必須避開先前碰過的數字,否則他就會爆炸。

為簡單起見,我們限制克林貢人在選擇移動的順序,必須「向右、向左、向下、向上」的順序去尋找活路。譬如向右走是活路,就直接向右走,之後再繼續同樣的順序作選擇;如果向右走是會爆炸的話,接下來就看向左會不會爆炸,以此類推。

從一個檔案讀入 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 

d018: 2007 程式達人 A - 克林貢人的血腥遊戲  

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;
            }
        }
        }
    }
}

arrow
arrow
    文章標籤
    JAVA
    全站熱搜

    cookiesp 發表在 痞客邦 留言(0) 人氣()