수다닷컴

  • 해외여행
    • 괌
    • 태국
    • 유럽
    • 일본
    • 필리핀
    • 미국
    • 중국
    • 기타여행
    • 싱가폴
  • 건강
    • 다이어트
    • 당뇨
    • 헬스
    • 건강음식
    • 건강기타
  • 컴퓨터
    • 프로그램 개발일반
    • C언어
    • 비주얼베이직
  • 결혼생활
    • 출산/육아
    • 결혼준비
    • 엄마이야기방
  • 일상생활
    • 면접
    • 취업
    • 진로선택
  • 교육
    • 교육일반
    • 아이교육
    • 토익
    • 해외연수
    • 영어
  • 취미생활
    • 음악
    • 자전거
    • 수영
    • 바이크
    • 축구
  • 기타
    • 강아지
    • 제주도여행
    • 국내여행
    • 기타일상
    • 애플
    • 휴대폰관련
  • 프로그램 개발일반
  • C언어
  • 비주얼베이직

최단거리 구하는 거 도와주세요!!! 꼭좀 봐주세요!

로지

2023.04.01

질문 제목 : 최단거리 구하는 소스질문 요약 :놀이기구사이의 최단거리와 길이 막혔을 경우 다시 돌아가는 거리 구하는 법
소스 두가지를 어떻게 합쳐야 하는지질문 내용 : 최단거리를 구해야 하는데 이게 각각 놀이기구 사이의 최단거리와 그 놀이기구들 사이에서 퍼레이드 같은걸로 길이 막혔을 때 다른길로 가는 최단거리를 구해야 하는데 소스 두개를 어떻게 합쳐야 하나요?
#includestdio.h
#define n 32//vertex의 갯수
#define m 10000//최장거리 보다 큰값
void main()
{
int data[n][n] = {//건물들간의 그래프 관계
// 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2
{0,m,m,m,m,m,3,m,m,m,m,m,m,m,m,2,m,m,m,m,m,m,m,m,m,m,m,1,m,m,m,m},
{m,0,3,m,m,m,1,m,m,m,1,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m},
{m,3,0,m,m,m,3,m,m,m,m,m,m,m,2,m,m,1,m,m,m,m,m,m,m,m,m,m,m,m,m,m},
{m,m,m,0,2,2,m,m,m,m,m,m,1,m,m,m,m,m,m,m,3,m,m,m,m,m,m,m,m,m,m,m},
{m,m,m,2,0,m,m,m,m,m,m,2,m,m,m,m,m,m,2,m,m,m,m,m,m,m,m,m,m,m,m,m},
{m,m,m,m,2,0,m,m,m,m,1,3,2,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m},
{m,1,m,3,m,m,0,m,m,m,m,m,m,2,m,m,3,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m},
{m,m,m,m,m,m,m,0,m,m,m,m,m,m,2,m,m,m,m,m,m,m,1,m,m,2,m,m,m,m,m,m},
{2,m,m,m,m,m,m,m,0,m,m,m,m,m,m,1,1,m,m,m,m,m,m,m,m,m,m,m,m,2,m,m},
{2,m,m,m,m,m,m,m,m,0,m,m,m,m,m,m,m,m,m,2,m,m,m,m,m,m,m,1,m,m,m,m},
{m,1,m,m,m,1,m,m,m,m,0,3,m,m,4,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m},
{m,m,m,m,1,2,m,m,m,m,3,0,m,m,2,m,m,m,m,m,m,m,m,m,m,1,m,m,m,m,m,m},
{m,m,m,1,m,1,m,m,m,m,m,m,0,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,1,m,m,m,m,m,m,0,m,m,m,m,m,m,m,m,m,m,m,m,1,m,m,m,m,m},
{m,m,2,m,m,m,m,2,m,m,m,2,m,m,0,m,m,2,m,m,m,m,m,m,m,2,m,m,m,m,m,m},
{2,m,m,m,m,m,m,m,m,1,m,m,m,m,m,0,1,m,m,m,m,m,m,m,m,m,1,m,m,m,m,m},
{m,m,m,m,m,m,m,m,1,m,m,m,m,m,m,1,0,m,m,m,m,m,m,m,m,m,1,m,m,m,m,m},
{m,m,1,m,m,m,m,m,m,1,m,m,m,m,1,m,m,0,m,2,m,2,m,m,m,m,m,1,m,m,m,m},
{m,m,m,m,1,m,m,m,m,m,m,m,m,m,m,m,m,m,0,m,m,m,m,1,m,m,m,m,m,m,m,m},
{m,m,m,m,m,m,m,m,m,1,m,m,m,m,m,m,m,2,m,0,m,1,m,m,m,m,m,m,m,m,m,m},
{m,m,m,1,m,m,m,m,m,m,m,m,2,m,m,m,m,m,m,m,0,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,3,m,2,m,0,m,m,m,m,m,m,m,m,m,1},
{m,m,m,m,m,m,m,1,m,m,m,m,m,m,m,m,m,m,m,m,m,m,0,1,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,1,m,m,m,1,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,2,m,m,m,0,m,m,m,m,m,m,m},
{m,m,m,m,m,m,m,2,m,m,m,1,m,m,1,m,m,m,m,m,m,m,2,m,m,0,m,m,m,m,m,m},
{m,m,m,m,m,m,2,m,m,m,m,m,m,1,m,1,1,m,m,m,m,m,m,m,m,m,0,m,m,m,m,m},
{1,m,2,m,m,m,m,m,m,1,m,m,m,m,m,m,m,2,m,m,m,m,m,m,m,m,m,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,0,m,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,0,m,m},
{m,m,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,0,m},
{m,m,m,m,m,m,m,1,m,m,m,m,m,m,2,m,m,m,m,m,m,2,m,m,m,m,m,m,m,m,m,0}
};
int s, e;
int k, min;
int ver[n], dis[n], via[n];//가는 경로와 거리를 저장하는 배열

printf(input start position: );
scanf(%d, &s);
printf(input end position: );
scanf(%d, &e);
for(int j=0; jn; j++)//배열 초기화
{
ver[j] = 0;
dis[j] = m;
}

dis[s-1] = 0;//자신의 위치 거리 0
for(int i=0; in; i++){//최단경로 찾는 for문
min = m;
for(j=0; jn; j++){//이어진 건물 탐색
if(ver[j]==0 && dis[j]min){
k = j;
min = dis[j];
}
}
ver[k] = 1;//한번 찾은 길 표시
if(min==m) break;//막다른길 이면 break;
for(j=0; jn; j++){//찾아놓은 길보다 가까운 길이 있는지 확인
if(dis[j] dis[k] + data[k][j]){
dis[j] = dis[k] + data[k][j];
via[j]=k;//경로 저장
}
}
}
printf(\n%d에서 %d로 가는 최단 거리 : %d\n, s, e, dis[e-1]);
int path[n], path2=0;
k=e-1;
while(1)//경로 출력
{
path[path2++]=k;
if(k==s-1) break;
k=via[k];
}
printf(path: );
for(i=path2-1;i=1;i--){//뒤에 부터 탐색하면서 경로 출력
printf(%d - ,path[i]+1);
}
printf(%d\n,path[i]+1);
}

일단 이게 길이 막혔을 때 다른길 찾는 거구여

#include stdio.h
#include string.h
#define MAX 999//정점이 직접적으로 연결되지 않았을때 들어가는 값
//Y[]: V가 Y에 속하면 1 속하지 않으면 0, touch[]: V의 index
//length[]:V(start)에서 V(i)로의 최단 경로의 길이
const char name[38][60]={//1번부터 38번까지 정점들의 이름
{신밧드의 모험}, {스페인해적선}, {후룸라이드}, {회전목마},{환상의 오딧세이},{자이안트 루프},{회전바구니},{황야의 무법자},
{볼배틀},{4D 입체영화관},{어린이 범퍼카},{스윙팡팡},{매직붕붕카},{크레이지 범퍼},{트러블 호퍼},{로티 트레인},
{아트란티스},{자이로스윙},{범퍼카},{고스트 하우스},{자동차 경주},{자이로드롭},{환타지 드림},{제네바 유람선},
{후렌치 레볼루션},{정글탐험보트},{월드모노레일},{파라오의 분노},{풍선비행},{다이나믹 시어터},
{동물극장},{회전 그네},{어린이 왕국},{번지드롭},{고공파도 타기},{혜성 특급},{캐슬 뮤직쇼},{호반 보트}
};
void Dijkstra(int n, int W[][38], int *touch, int *length) {
int Y[38], i, Vnear,, Vnear, start, step, min;
printf(\n끝점을 입력해주세요\n);//원래는 시작점을 입력받는 것인데 출력과정에서보면
scanf(%d,&start);//시작점이 제일 끝에서부터 나오기 때문에 편의상 끝점이라고 표기함

for(i=1; i=n; i++) {
Y[i] = 0;//Y[]를 0으로 초기화
length[i]=MAX;//length[]를 MAX로 초기화
}
Y[start]=1;//시작점은 무조건 포함되기 때문에 1로 바꿈
length[start]=0;//시작점의 길이를 0으로 바꿈
for(i=0; i=n; i++) {
if(i==start) touch[i]=0;
else touch[i]=start;
length[i]=W[start][i];
}

for(step=1; step=n; step++) {//Y값이 0이면서 length값이 최소인 i를 Vnear로 한다.
min = MAX;
for(i=0; i=n; i++)
{
if(Y[i]==0 && length[i]min)
{
Vnear = i;
min = length[i];
}
}
Y[Vnear]=1;

for(i=0;i=n;i++) {//시작점부터 각 정점들의 최단거리를 구한다.
if(length[Vnear]+W[Vnear][i]length[i]) {
length[i]=length[Vnear]+W[Vnear][i];
touch[i]=Vnear;
}
}
}
printf(\n시작점을 입력하세요\n);
scanf(%d,&i);
printf(시작점 : %s ,name[i-1]);
Vnear = i;
while(touch[Vnear] != 0) {//시작점부터 끝점까지 지나는 모든 정점들을 출력
if(strcmp(name[i-1],name[touch[Vnear]-1])) {//name[i-1]와name[touch[Vnear]-1]의 내용을 비교하여
//내용이 같을 경우 출력을 하지 않는다.
printf(-- %s ,name[touch[Vnear]-1]);
}
Vnear=touch[Vnear];
}
printf( 까지의);
printf(\n최단거리는 %d 입니다.\n,length[i]);
}

이건 임의로 이름만 바꺼서 한건데 돌아가진 않는 것 같아요..
이거 두개를 합쳐야 하는데.. 어떻게 합쳐야 하죠??
도와주세요 !!!

신청하기





COMMENT

댓글을 입력해주세요. 비속어와 욕설은 삼가해주세요.

  • 천칭자리

    이건 다익스트라와 그래프, 함수 모듈화에 대한 이해가 없으면 이해시켜드리기가 좀 어렵겠는데요...

    질문자분의 수준이 어느정도인지 알 필요가 있습니다.

    함수는 제대로 짤 수 있는지, 자료구조는 해보았는지, 그래프가 뭔지는 아는지 등 말이죠.

번호 제 목 글쓴이 날짜
2700070 while문 , 3의배수 출력하는 프로그램좀 짜주세욤. 횃불 2025-07-01
2700041 초보인데요 ㅎ 배열안에 배열을 집어넣을수 있나요?? 헛장사 2025-07-01
2700012 배열// (1) 전갈자리 2025-07-01
2699895 무한루프에 빠집니다.!! 해결좀부탁드려요 (10) 선아 2025-06-30
2699842 질문을 너무 많이 하네여.....죄송.... (2) 해님꽃 2025-06-29
2699816 오류 질문입니다.. (1) 해비치 2025-06-29
2699763 질문입니다 ! 꼭 좀 도와주세요ㅠㅠ (2) 미라 2025-06-28
2699555 c언어 다항식을 입력을 했는데 왜 출력이 안될까요? 피스케스 2025-06-27
2699528 C언어 포인터연산 질문입니다. (3) 안녕나야 2025-06-26
2699476 끌어올림;;달력 짜봤는데요 이 소스 줄일 수 있나요? - 스샷첨부 (2) 클라우드 2025-06-26
2699444 [좀 급함] system("explorer [주소] ") 문에 변수를 사용할 수 있나요? 알 2025-06-26
2699415 파일//read//와 배열 아란 2025-06-25
2699386 구조체 안에 일부분만 char 배열에 복사하려면 어떻게 해야하나요? (1) 미즈 2025-06-25
2699361 연결리스트 정렬하는 부분에 대해서 질문 드립니다 아이처럼 2025-06-25
2699304 [기초]아직 안주무시는분 계신가요..?포인터배열? 좀 도와주세요. 놀리기 2025-06-24
2699272 printf() 함수이용해서 프로그램 만들기 질문요! (5) 다가 2025-06-24
2699221 PUSH와 POP코드를 더 간단하게 어떻게 해야할까요? 파라미 2025-06-24
2699192 설치오류가 자꾸 나요 한번봐주세여~ (1) 소녀틳향기 2025-06-23
2699161 for loop안에 있는 if문 (9) Orange 2025-06-23
2699105 링크더리스트 이전 링크값 출력함수. 꼬꼬마 2025-06-23
<<  이전  1 2 3 4 5 6 7 8 9 10  다음  >>

수다닷컴 | 여러분과 함께하는 수다토크 커뮤니티 수다닷컴에 오신것을 환영합니다.
사업자등록번호 : 117-07-92748 상호 : 진달래여행사 대표자 : 명현재 서울시 강서구 방화동 890번지 푸르지오 107동 306호
copyright 2011 게시글 삭제 및 기타 문의 : clairacademy@naver.com