BloggerAds

2011年7月6日 星期三

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

內容:


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


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


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


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