dfs 미궁 탈출 문제 해결
13815 단어 알고리즘
제목 설명
작은 지 는 나 쁜 놈 에 게 A x A 칸 으로 구 성 된 매트릭스 미로 에 잡 혔 다.* 로 소지 가 지나 갈 수 있 는 칸 을 표시 합 니 다.'#' 는 소지 가 지나 갈 수 없 는 칸 을 나타 낸다.소지 의 시작 위 치 는 왼쪽 상단 에 있 고 그 는 오른쪽 아래 칸 에 도착 해 야 미 로 를 벗 어 날 수 있다.샤 오 지 는 한 걸음 한 걸음 상하 좌우 네 방향 으로 인접 한 칸 으로 이동 할 수 있 는데 전 제 는 목표 형식 에 장애 가 없어 야 한 다 는 것 이다.
이제 소 지 는 마법 으로 칸 의 장 애 를 제거 할 수 있다. 즉, \ # 가 * 가 되 어 지나 갈 수 있 게 한다.최대 B 곳 의 장 애 를 제거 할 수 있 는 상황 에서 샤 오 지 는 최소한 몇 걸음 을 움 직 이면 미 로 를 벗 어 날 수 있 는 지 계산 해 보 세 요.
첫 줄 에 두 개의 정수 A 와 B 를 포함 하 는 것 을 입력 하 십시오.아래 A 줄 은 A x A 의 행렬 을 포함한다.행렬 은 왼쪽 상단 과 오른쪽 하단 을 * 로 보장 합 니 다.정 수 를 출력 하여 답 을 표시 하 다.소지 가 미로 에서 벗 어 나 지 못 하면 출력 - 1.
샘플 입력 52 * \ # * \ # * \ # * * \ # * * \ # # \ # # \ # * \ # * * * * * * * * 샘플 출력 8
문제 풀이 의 사고 방향.
dfs 로 해결 할 수 있 는 미로 문제 가 분명 합 니 다.그러나 이 요 구 는 최소 몇 걸음 을 이동 해 야 하기 때문에 우 리 는 매번 찾 는 경로 의 걸음 수 를 기록 하고 그 중에서 가장 작은 것 을 찾 아야 한다.
우 리 는 이 문제 가 칸 의 장 애 를 제거 할 수 있다 는 것 을 알 게 되 었 다. 즉, \ # 가 * 로 변 하지만 가장 많은 b 곳 을 제거 할 수 있다.그래서 우 리 는 하나의 변수 로 지금까지 모두 몇 개 를 없 앴 는 지 기록 할 수 있다. 이 숫자 가 b 보다 작 으 면 우 리 는 계속 갈 수 있다.
재 귀 중지 조건 은 바로 오른쪽 아래 까지 가 는 것 이 고 이때 제거 하 는 장애 의 개 수 는 b 보다 적다.재 귀 과정 은 우리 가 네 방향 으로 한 걸음 더 가 려 고 하 는 것 이다. 만약 에 이 걸음 으로 도착 하 는 곳 이 미로 범위 안에 있다 면.그리고 지나 가지 않 았 습 니 다. 그리고 이때 장 애 를 없 애 는 개 수 는 b 보다 적 습 니 다. 그러면 우 리 는 이 걸음 을 걸 어서 계속 내 려 갈 수 있 습 니 다.주의해 서 걸 을 때 우 리 는 이 점 이 장애 인지 통로 인지 판단 할 필요 가 없다. 우 리 는 현재 장 애 를 없 애 는 개수 만 판단 하면 된다.
코드 는 다음 과 같다.
#include
using namespace std;
char s[1000][1000];
bool vis[1000][1000];//
int dir[4][2]= {{1,0},{-1,0},{0,1},{0,-1}};//
int a,b;
int ans = 1e9;//
int v = 0;// , -1
// , x,y, , 。
void dfs(int x,int y,int cnt,int num){
if(x == a-1 && y == a-1 && num<=b){
ans = min(ans,cnt);
v++;
return;
}
//printf("1111
");
for(int i = 0; i<4; i++){
int p = x+dir[i][0];
int q = y+dir[i][1];
if(p >= 0 && p < a && q >= 0 && q < a && vis[p][q] == false && num<=b){
vis[p][q] = true;//
cnt++;// 1
if(s[p][q] == '#') num++;// , 1
dfs(p,q,cnt,num);
vis[p][q] = false;
cnt--;
if(s[p][q] == '#') num--;
}
}
return;
}
int main(){
scanf("%d%d",&a,&b);
for(int i = 0; i< a; i++){
scanf("%s",s[i]);
}
memset(vis,false,sizeof(vis));
vis[0][0] = true;
dfs(0,0,0,0);
if(v == 0) printf("-1");
else printf("%d",ans);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
물체 검출의 평가 지표 IoU의 계산 방법Yolo나 SSD 등 물체 검출에서 평가 지표로 사용되는 IoU에 대해 조사했으므로 정리했습니다. IoU (Intersection over Union)는 두 영역이 얼마나 겹치는지를 나타내는 지표입니다. 두 영역의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.