------------------------------------------------------------------------------------------------------------------------------------------------------------------------
인접행렬을 만든뒤에 BFS 돌리면 된다. BFS문제를 오랜만에 풀어서그런지 너무 코드가 더럽다.
요로코롬 인접행렬만들기
#include<stdio.h>
#define A 1001
char arr[A][31];
int map[A][A], min=1001, N, K, start, stop, Q[A][3],check[A][A],count;
int min_last,root[A],root_count;
void BFS()
{
int bun = 1, work = 0; // Q[][0] 에는 인접행렬 Q[][1] 에는 이동 횟수
Q[1][0] = start;
while (1)
{
if (bun == work) break;
work++;
for (int i = 1; i <= N; i++)
{
if (map[Q[work][0]][i] == 1 && i != start && check[Q[work][0]][i] == 0)
{
bun++;
check[Q[work][0]][i] = 1;
check[i][Q[work][0]] = 1;
Q[bun][0] = i;
Q[bun][1] = Q[work][1] + 1;
Q[bun][2] = work;
}
if (Q[bun][0] == stop)
{
if (Q[bun][1] < min)
{
min = Q[bun][1];
min_last = bun;
}
}
}
}
}
int main()
{
scanf("%d %d", &N, &K); // N : 코드 수 , K : 코드 길이
for (int i = 1; i <= N; i++) // 코드 입력
scanf("%s", &arr[i]);
scanf("%d %d", &start, &stop); // start : 시작위치 , stop : 도착위치
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= N; j++)
{
for (int k = 0; k < K; k++)
{
if (arr[i][k] != arr[j][k])
count++;
}
if (count == 1)
map[i][j] = 1;
count = 0;
}
}
BFS();
while (1)
{
root[root_count] = Q[min_last][0];
min_last = Q[min_last][2];
if (min_last == 0)
break;
root_count++;
}
if (min == 1001)
printf("-1");
else
{
for (int i = min; i >= 0; i--)
printf("%d ",root[i]);
}
return 0;
}
'알고리즘' 카테고리의 다른 글
맨하탄 거리 측정법 과 유클리드 거리 측정법 (0) | 2017.01.19 |
---|---|
2531번 회전초밥 (조건변경으로 난이도 업) (0) | 2017.01.12 |
1699번 제곱수의 합 (0) | 2017.01.08 |
2531번 회전초밥 (0) | 2017.01.08 |
Visual Studio 주석처리 , 자동 정렬 (0) | 2016.12.26 |