드래그 앤 드롭으로 즐겨찾기 아이콘 위치 수정이 가능합니다.
게시물ID : computer_22981 짧은주소 복사하기
작성자 : 눈팅눈팅 ★
추천 : 0
조회수 : 388회
댓글수 : 2개
등록시간 : 2011/11/08 13:20:31
다익스트라 알고리즘을 이용했습니다 ㅜㅜㅜ 분명히 시작점하고 끝점은 잘찾는것 같은데..... 경로를 출력을 잘 못합니다.ㅜㅜㅜㅜ 분명히 걸리는 시간은 정확하게 나오는데, 경로가 환승역에서 완전히 이상한대로 갑니다 ㅜㅜ 다익스트라 경로만 뭐가 잘못됫는지 파악해주시면안될까요 ㅜ? 맨밑에가 경로 알고리즘입니다.ㅜㅜㅜ class Station { //station 클래스 선언! (클래스와 객체 개념을 이용합니다..!) String station_name; // 역이름 int station_num; // 역번호 Station(int num, String name) { //Station의 생성자 메소드 선언. station_num = num; station_name = name; } } import java.io.*; public class Station_line { public static void main(String [] args) throws IOException { int a; int b; int c; //카운터 a,b,c,d형성 String start_enter; String end_enter; int start =0 ; int end = 0; int m = 10000; //null값 역할을 하는 m 선언 int i,j,k=0; float min; //카운터 i,j,k 선언하기 for문에서 이용할 min값 사용 (= m값이 null값으로 쓸 쑤 잇게 하기..!) int [] v = new int[40]; //v[]선언 하기. data배열에서 열이 계산 됫는지 안됫는지 유무 파악하는 기능 배열 float [] distance = new float[40]; //distance[]선언하기. 실제 거리 배열 int [] via = new int[40]; float data[][]={ {0,4,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m}, {4,0,4,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m}, {m,4,0,7,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m}, {m,m,7,0,9,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m}, {m,m,m,9,0,3,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m}, {m,m,m,m,3,0,5,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m}, {m,m,m,m,m,5,0,5,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m}, {m,m,m,m,m,m,5,0,3,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m}, {m,m,m,m,m,m,m,3,0,5,3,2,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m}, {m,m,m,m,m,m,m,m,5,0,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m}, {m,m,m,m,m,m,m,m,3,m,0,m,m,5,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m}, {m,m,m,m,m,m,m,m,2,m,m,0,m,m,4,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m}, {m,m,m,m,m,m,m,m,m,m,m,m,0,4,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m}, {m,m,m,m,m,m,m,m,m,m,5,m,4,0,2,m,m,m,m,m,m,4,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m}, {m,m,m,m,m,m,m,m,m,m,m,4,m,2,0,5,m,m,m,m,m,m,5,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m}, {m,m,m,m,m,m,m,m,m,m,m,m,m,m,5,0,2,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m}, {m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,2,0,2,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m}, {m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,2,0,5,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m}, {m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,5,0,2,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m}, {m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,2,0,4,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m}, {m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,4,0,m,m,m,m,m,m,m,m,m,m,2,m,m,m,m,m,m,m,m}, {m,m,m,m,m,m,m,m,m,m,m,m,m,4,m,m,m,m,m,m,m,0,m,m,m,4,m,m,m,m,m,m,m,m,m,m,m,m,m,m}, {m,m,m,m,m,m,m,m,m,m,m,m,m,m,5,m,m,m,m,m,m,m,0,m,m,m,5,m,m,m,m,m,m,m,m,m,m,m,m,m}, {m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,0,2,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m}, {m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,2,0,2,m,m,m,m,m,m,m,m,m,m,m,m,m,m}, {m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,4,m,m,2,0,2,m,m,m,m,m,2,m,m,m,m,m,m,m}, {m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,5,m,m,2,0,4,m,m,m,m,m,2,m,m,m,m,m,m}, {m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,4,0,4,m,m,m,m,m,m,m,m,m,m,m}, {m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,4,0,2,m,m,m,m,m,m,m,m,m,m}, {m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,2,0,4,m,m,m,m,m,m,m,m,m}, {m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,4,0,2,m,m,m,m,m,m,m,m}, {m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,2,m,m,m,m,m,m,m,m,m,2,0,m,m,m,m,m,m,m,40}, {m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,2,m,m,m,m,m,m,0,m,2,m,m,m,m,m}, {m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,2,m,m,m,m,m,m,0,m,1,m,m,m,m}, {m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,2,m,0,m,3,m,m,m}, {m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,1,m,0,m,2,m,m}, {m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,3,m,0,5,m,m}, {m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,2,5,0,3,m}, {m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,3,0,4}, {m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,10,m,m,m,m,m,m,4,0}, }; String[] names = new String[40] ; names[0] = "소요산"; names[1] = "동두천"; names[2] = "동두천중앙"; names[3] = "덕정"; names[4] = "양주"; names[5] = "녹양"; names[6] = "의정부"; names[7] = "망월사"; names[8] = "도봉산"; names[9] = "장암"; names[10] = "수락산"; names[11] = "도봉"; names[12] = "당고개"; names[13] = "노원"; names[14] = "창동"; names[15] = "수유"; names[16] = "미아"; names[17] = "미아삼거리"; names[18] = "성신여대입구"; names[19] = "한성대입구"; names[20] = "동대문"; names[21] = "하계"; names[22] = "월계"; names[23] = "봉화산"; names[24] = "화랑대"; names[25] = "태릉입구"; names[26] = "석계"; names[27] = "상월곡"; names[28] = "고려대"; names[29] = "안암"; names[30] = "창신"; names[31] = "동묘앞"; names[32] = "먹골"; names[33] = "신이문"; names[34] = "중화"; names[35] = "외대앞"; names[36] = "상봉"; names[37] = "회기"; names[38] = "청량리"; names[39] = "신설동"; //이걸 한번에 표시할 수 있는.. 포토샵 같은게 필요해! Station[] stations = new Station[40] ; for(a=0;a<40;a++) { stations[a] = new Station(a,names[a]); } //http://ddogani.blog.me/50083572952 객체배열 감사합니다. BufferedReader br = new BufferedReader( new InputStreamReader( System.in )); //bufferedReader 클래스의 사용.( 입력 스트림) System.out.print(" 출발역을 입력하세욧! : " ); start_enter = br.readLine() ; for(b=0;b<40;b++) { if(start_enter.equals(stations[b].station_name)) { start = b; stations[b] = new Station(b,names[b]); } } System.out.print(" 도착역을 입력하세욧! : " ); end_enter = br.readLine(); for(c=0;c<40;c++) { if(end_enter.equals(stations[c].station_name)) { end = c; } } // start,end 값에 입력값 받기. for( j=0; j<40; j++ ) { v[j] = 0; distance[j] = m; } //초기화하기 distance[start] = 0; // 자기 자신과의 역거리는 0이므로 0으로 선언한다..! for( i=0; i<40; i++ ) { min = m; for( j=0; j<40; j++ ) { if( v[j] == 0 && distance[j] < min ) { //v[]의 역할은 그 열이 실행됬으면 다시하지 않는 역할. k = j; min = distance[j]; } //data[][] 에서 s지점 구하기. } //distance가 s값을 받으면서 자기 자신의 위치 '0'을 사용 함으로써 자기 자신의 위치를 처음에 // v[k] = 1; // 그래서 여기에 1을 넣어 줌으로써 안한 0 을 다시 for문 돌면서 처리 하는거지 if(min==m) break; // for(j=0; j<40; j++) { if(distance[j] > distance[k] + data[k][j]) { //data[k][j]의 의미는 k번 역에서 j번 역으로 가는 거리임...! 즉 distance[j]는 null값 역할을 하는 distance[j] = distance[k] + data[k][j]; via[j]=k; //m에 v[]값을 이용해 구해진 k열에그리고 ditance[k]는 0임 언제나..!자기자신임..! } // s가 있는 행의 배열 구하기. distance[] s가 있는 행의 배열이 되는거지 //= 이말이 뭘 뜻하는 거냐면, 1번에서 갈 수 있는 역을 말하는 거지. } } // 이거 i있는 포문에 끝이여. i의 역할은 s역에서 ?역까지 반복문으로 다하 는거야 초기값은 위치찾고 다음에는 1역 2역...순서대로 찾는거지. // 이 for문은 i가 7까지 돌면서 시작점에서 을 찾아서 넣고, v[]값을 이용해서 차례차례 그 열에 해당하는 distance를 구하는 방법...! System.out.println(stations[start].station_name + "에서 출발하여, " + stations[end].station_name + "로 가는 최단 시간은 " +distance[end]+" 분 입니다."); //via[]값이 의미하는 것 이해하기...! int path[] = new int[40]; int path_cnt=0; k=end; while(true) { //무한 루프 선언. path[path_cnt++]=k; if(k==start)break; //끝점과 시작점이 같다면 필요없겟지. k=via[k]; //via[]은 i를 받아오는 거잔아 거기 까지 몇번 돌았는지를 확인하는 배열이야. } System.out.print(" 경로는 : "); for(i=path_cnt-1;i>=1;i--) { System.out.print(stations[path[i]+1].station_name +" -> "); } System.out.printf(stations[path[i]+1].station_name +"입니다"); } }
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.
새로운 댓글이 없습니다.