프로그래밍/C++

16928 뱀과 사다리 게임 [c++]

김파츠 2023. 6. 9. 14:10

알고리즘
N과 M을 입력
bfs 시작
  1부터 시작하므로 큐에 1-0 (칸-횟수) 삽입
  큐에서 팝한 칸을 start 라고 했을 때,
   start + 1~6까지의 칸을 탐색. 
  ( 칸 안에는 칸에 도착할 수 있는 최소 횟수)
   만약 start + 1~6까지의 칸을 이미 방문했으나(1>= && 지금(start칸 횟수+1)이 작으면 갱신.아니면 밑에꺼 다 패스)
   Start + 1~ 6의 칸의 횟수 = Start 칸의 횟수+ 1
   만약 start + 1~6이 100이라면
     100의 최소 횟수 갱신하기
  
  만약 start + 1~6이 뱀이나 사다리면
   이동 한 다음 이동한 칸의 횟수도 Start 칸의 횟수+ 1로 넣기.
    큐에 이동한 칸을 넣기
  아니면
    주사위로 이동한 칸을 넣기
 
자료구조
map snake,ladder / 시작 칸-도착 칸 이어줌
int IsVisited[] / 인덱스는 칸 번호. 값은 이 칸까지 갈 때 주사위 굴리는 최소 횟수

#include <iostream>
#include <queue>
#include <map>
#define MAX 101
using namespace std;

map<int,int> ladder;
map<int,int> snake;
int isVisited[MAX];

int bfs()
{
	int ans = 0;
	
	queue<pair<int,int>> q;
	 //first : 칸
	 // second : 이 칸까지 갈수있는 최소 주사위 굴리기횟수
	isVisited[1] = 0;
	q.push(make_pair(1,0));
	while(!q.empty()){
		int nowIdx = q.front().first;
		int nowNum = q.front().second;
		q.pop();
		
		
		for(int i=1;i<=6;i++){
			
			int tIdx = nowIdx+i;
			int tNum = nowNum+1;
			
			if(isVisited[tIdx]>=1&&tNum>isVisited[tIdx])
			continue;
			
			if(tIdx == 100){
				if(tNum < ans||isVisited[tIdx]==0){
				  ans = tNum;
				  isVisited[tIdx] = tNum;
				  continue;				 
				}
			}else if(tIdx>100){
				continue;
			}
			
			isVisited[tIdx] = tNum;
			
			
			if(ladder.find(tIdx) != ladder.end()){
				tIdx = ladder[tIdx];
				isVisited[tIdx] = tNum;
				
			}else if(snake.find(tIdx) != snake.end()){
				tIdx = snake[tIdx];
				isVisited[tIdx] = tNum;				
			}
			
			    
			q.push(make_pair(tIdx, tNum));
			
			
		}
		
	}
	
	return ans;
}


int main(int argc, char *argv[])
{
	int N,M;
	cin >> N >> M;
	//cout << N << M;
	
	for(int i=0;i<N;i++)
	{
		int a,b;
		cin >> a >> b;
		ladder.insert({a,b});
	}
		
	
	for(int i=0;i<M;i++)
	{
		int a,b;
		cin >> a >> b;
		snake.insert({a,b});
}
	
	cout << bfs();
}