프로그래밍 알고리즘

[정올 2261] 경로 찾기

꾸준한사람 2023. 1. 7. 19:46
반응형

http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&code=2261 

 

JUNGOL

 

www.jungol.co.kr

#include <stdio.h>
//#define DEBUG

const int INF = 99999999;
int N, K, S, D, s, e;
bool visited[1010]; //가장 짧은 해밍 거리를 구해야 하는 것이므로, 한 번 해밍거리 1로 push된 놈을 또 방문하면 안 된다.
char arr[1010][32];
struct P {
	int idx; //마지막 방문지점
	int cnt; //방문 히스토리 개수
	short* hist;
	void operator=(const P& from) {
		idx = from.idx;
		cnt = from.cnt;
		for (int i = 0; i < from.cnt; i++) hist[i] = from.hist[i];
	}
} que[100000], *cur, ans;
void enq(const P& src, int nextidx) {
	visited[nextidx] = true;
	que[e].hist = new short[src.cnt + 2];
	que[e] = src;
	que[e].idx = nextidx;
	que[e].hist[que[e].cnt] = nextidx;
	que[e].cnt++;
#ifdef DEBUG
	printf("ENQ: Idx(%d), Cnt(%d)\n", que[e].idx, que[e].cnt);
	for (int i = 0; i < N; i++) {
		printf("%d ", que[e].hist[i]);
	}
	printf("\n");
#endif
	e++;
}
P& deq() { return que[s++]; }
bool IsHamDist1(int idx1, int idx2) {
	int dist = 0;
	for (int i = 0; i < K; i++) {
		if (arr[idx1][i] != arr[idx2][i]) dist++;
		if (dist > 1) return false;
	}
	return (dist == 1);
}
void BFS() {
	ans.hist = new short[N + 1];
	for (int i = 0; i < N + 1; i++) ans.hist[i] = 0;
	enq(ans, S);
	ans.cnt = INF;

	while (s < e) {
		cur = &deq();
		if (cur->idx == D && ans.cnt > cur->cnt) {
			ans = *cur; //D에 도착한 것이 있으면, cnt를 비교하여 정답에 넣음
			if (ans.cnt == 1) return; //한번만에 도착한거면 무조건 정답이므로
		}
		for (int i = 1; i <= N; i++) {
			if (visited[i]) continue;	//이미 push된 곳이면 skip
			if (IsHamDist1(cur->idx, i) == false) continue;	//해밍거리가 1이 아니면 skip
			enq(*cur, i); //다음 지점으로 방문할 수 있는 곳(해밍거리 1인것만 인큐됨)
		}
	}
}

int main(void) {
	//freopen("input.txt", "r", stdin);
	scanf("%d%d", &N, &K);
	for (int i = 1; i <= N; i++) {
		scanf("%s", arr[i]);
	}
	scanf("%d%d", &S, &D);
	BFS();
	if (ans.cnt == INF) printf("-1\n"); //해밍경로 없는 경우
	else { 
		for (int i = 0; i < ans.cnt; i++) //찾아야 하는 값
			printf("%d ", ans.hist[i]);
		printf("\n");
	}

	return 0;
}
반응형

'프로그래밍 알고리즘' 카테고리의 다른 글

[정올 2461] 공주님의 정원  (0) 2023.01.08
[정올 2300] 용액  (0) 2023.01.07
[정올 2255] 섞기 수열  (0) 2023.01.07
[정올 2247] 도서관  (0) 2023.01.07
[정올 2194] 요플레공장  (1) 2023.01.07