MoveCrashingWall - map[nx][ny]값 기준 vs 벽부순횟수(0or1)기준
Solution1 : map[nx][ny]에 따라 bfs 진행 (가장 직관적) 큐에 다음 좌표 생성해서 넣을 때 현재까지 벽 부순횟수(cur.dCnt) 계속 넘겨주거나, 다음좌표가 1인경우에는 벽 부순횟수로 1을 넘겨주며 다음좌표를 생성한다.
map[nx][ny] == '1'//벽인 경우. 벽을 뚫어야함. cur.dCnt == 0 && !visited[nx][ny][1] 일 때만 탐색한다! q.add(new Point(nx,ny,1,cur.dist+1); visited[nx][ny][1] = true;
map[nx][ny] == '0'//0인 경우. 현재까지 벽 부순횟수는 0일수도, 1일수도 있다. !visited[nx][ny][cur.dCnt] 일 때만 탐색한다! q.add(new Point(nx,ny,cur.dCnt,cur.dist+1));//현재의 벽부순횟수 다음좌표로 넘겨준다! visited[nx][ny][cur.dCnt] = true;
⭐️⭐️⭐️⭐️⭐️Solution2 : 현재 좌표의 벽 부순 횟수에 따라 bfs 진행
cur.drill_Cnt == 1//현재까지 벽을 이미 한번 부순 경우 if(map[nx][ny] == '1' || visited[1][nx][ny]) continue; q.add(new Point(nx,ny,1,cur.dist+1);//map[nx][ny]==0인 경우에만 탐색! visited[nx][ny][1] = true; (map[nx][ny] == '1' : 가지 못한다. continue visited[1][nx][ny] : 방문체크! 벽을 한번 부쉈기 때문에 visited[1][nx][ny] 방문체크해준다.)
else(cur.drillCnt == 0)//아직 벽을 부수지 않은 경우 . if(visited[nx][ny][0]) continue; q.add(new mcw(nx,ny,map[nx][ny]-'0',cur.dist+1); visited[nx][ny][map[nx][ny]-'0'] = true;
다음좌표로 생성하는 mcw의 drillCnt는 다음 좌표(nx,ny) 값에 따라 벽을 부수는 횟수가 달라진다. map[nx][ny] == '1' : (nx,ny)에 대해 벽 부수는 횟수 drillCnt도 1이 되고 map[nx][ny] == '0' : (nx,ny)에 대해 벽 부수는 횟수 drillCnt도 0이 된다. 벽 부수는 횟수를 기준으로 bfs를 진행하기 때문에 다음 좌표를 생성할 때에도 벽 부수는 횟수를 업데이트해서 객체를 생성하고, 큐에 넣어줘야한다!
Last updated