한 걸음 한 걸음 쓰기 알고리즘 (의 A * 알고리즘)
앞의 블 로그 에서 사실 우 리 는 이미 길 을 찾 는 알고리즘 을 토론 한 적 이 있다.그러나 당시 예제 그림 에서 선택 할 수 있 는 경 로 는 유일 했다.우 리 는 알고리즘 을 하나 골 랐 다. 즉, 이 유일한 경 로 를 골 라 야 하 는데 어떻게 골 라 야 합 니까?당시 에 우 리 는 끝 없 이 돌아 가 는 알고리즘 을 채택 했다.그러나 오늘 의 상황 은 좀 다르다.어디 있 지?그것 은 바로 오늘 의 경로 가 n 개 입 니 다. 이 경 로 는 모두 목적지 에 도달 할 수 있 습 니 다. 그러나 우 리 는 선택 하 는 과정 에서 요구 가 있 습 니 다. 그것 이 바로 선택 한 경로 의 거리 가 가장 짧 습 니까?방법 이 없 을까요?
그렇다면 이 럴 때 는 A * 알고리즘 이 필요 하 다.A * 알고리즘 과 일반적인 알고리즘 은 어떤 차이 가 있 습 니까?우 리 는 하나의 예시 로 설명 할 수 있다.
/*
* 0 0 0 0 0
* 1 1 1 1 1
* 1 0 0 0 1
* 1 0 0 0 1
* A 1 1 1 1
*/
이것 은 5 * 5 의 배열 이다.만약 에 우리 가 array [1] [0] 에서 출발 하면 목 표 는 A 점 이다.우 리 는 그림 에서 목적지 에 도착 할 수 있 는 두 가지 방법 이 있 지만, 아래로 직행 하 는 방법 이 가장 짧다 는 것 을 발견 했다.그럼 이 가장 짧 은 알고리즘 을 어떻게 찾 습 니까?여러분, 잘 생각해 보 세 요.우 리 는 시간 을 도착 하기 몇 단계 로 돌아 갈 수 있 습 니까?우 리 는 왜 수평 방향의 점 보 다 는 방향 을 아래로 향 하 는 점 을 선택해 야 합 니까?원인 이 복잡 하지 않 은 것 은 모든 점 중에서 우리 가 선택해 야 할 이 점 과 목표 점 사이 의 거리 가 가장 짧 기 때문이다.그렇다면 이 가운데 경로 선택 이 바 뀌 었 을 까?사실은 가능 합 니 다. 길 을 선택 하 는 과정 에서 본 성 은 pk 의 과정 이기 때문에 우리 가 할 수 있 는 일 은 그 당시 의 목표 에서 가장 가 까 운 점 을 찾 는 것 입 니 다. 이 점 은 항상 변화 하 는 것 이기 때문에 마지막 으로 선택 한 길 은 이 렇 습 니 다.
/*
* 0 0 0 0 0
* 1 0 0 0 0
* 1 0 0 0 0
* 1 0 0 0 0
* A 0 0 0 0
*/
알고리즘 프로 그래 밍 알고리즘 을 어떻게 수정 해 야 합 니까?물론 데이터 구 조 를 먼저 정의 합 니까?typedef struct _VALUE
{
int x;
int y;
}VALUE;
그리고 목표 점 과 가장 짧 은 거 리 를 찾 았 다.int find_most_nearest_neigh(VALUE data[], int length, int x, int y)
{
int index;
int number;
int current;
int median;
if(NULL == data || 0 == length)
return -1;
current = 0;
number = (int) sqrt((data[0].x - x) * (data[0].x - x)+ (data[0].y - y) * (data[0].y - y));
for(index = 1; index < length; index ++){
median = (int) sqrt((data[index].x - x) * (data[index].x - x)+ (data[index].y - y) * (data[index].y - y));
if(median < number){
number = median;
current = index;
}
}
return current;
}
이 점 을 찾 으 면 모든 것 이 잘 될 것 입 니 다. 그러면 지금 우 리 는 data 를 다시 처리 해 야 합 니 다. 왜냐하면 팝 업 이 필요 하고 새로운 점 이 눌 러 서 처리 해 야 합 니 다.VALUE* updata_data_for_queue(VALUE* data, int length, int* newLen)
{
int index;
int count;
int max;
VALUE* pData;
if(NULL == data || 0 == length || NULL == newLen)
return NULL;
max = length << 2;
pData = (VALUE*)malloc(max * sizeof(VALUE));
memset(pData, 0, max * sizeof(VALUE));
count = 0;
for(index = 0; index < length; index ++){
if(check_pos_valid(data[index].x, data[index].y - 1)){
pData[count].x = data[index].x;
pData[count].y = data[index].y -1;
count ++;
}
if(check_pos_valid(data[index].x -1, data[index].y)){
pData[count].x = data[index].x -1;
pData[count].y = data[index].y;
count ++;
}
if(check_pos_valid(data[index].x, data[index].y + 1)){
pData[count].x = data[index].x;
pData[count].y = data[index].y +1;
count ++;
}
if(check_pos_valid(data[index].x + 1, data[index].y)){
pData[count].x = data[index].x + 1;
pData[count].y = data[index].y;
count ++;
}
}
*newLen = count;
return pData;
}
위의 함수 가 생기 면 findpath 는 아주 간단 합 니 다.
void find_path(int x, int y)
{
while(/* 0 */){
/* */
/* */
};
}
요약:
(1) A * 의 중점 은 디자인 가중치 판단 함수 에 있 고 가장 좋 은 다음 점프 를 선택 하 는 것 이다.
(2) A * 의 목 표 는 이미 알 고 있 는 것 이다.
(3) A * 는 격자 형 경로 찾기 에 특히 적합 하 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.