Произвольные точки старта и финиша
This commit is contained in:
19
kernel.cu
19
kernel.cu
@@ -7,6 +7,11 @@
|
|||||||
#define BLOCK_SIZE 16
|
#define BLOCK_SIZE 16
|
||||||
#define MATRIX_SIZE 32
|
#define MATRIX_SIZE 32
|
||||||
#define OBSTACLE_PROB 10
|
#define OBSTACLE_PROB 10
|
||||||
|
#define START_X 2
|
||||||
|
#define START_Y 2
|
||||||
|
#define FINISH_X (MATRIX_SIZE - 3)
|
||||||
|
#define FINISH_Y (MATRIX_SIZE - 3)
|
||||||
|
|
||||||
#define INF UINT_MAX // Используем беззнаковый максимум
|
#define INF UINT_MAX // Используем беззнаковый максимум
|
||||||
|
|
||||||
__global__ void wave_step(int* P, unsigned int* dist, int n, bool* changed) {
|
__global__ void wave_step(int* P, unsigned int* dist, int n, bool* changed) {
|
||||||
@@ -43,8 +48,8 @@ void generate_polygon(int* P, int n) {
|
|||||||
for (int i = 0; i < n*n; i++) {
|
for (int i = 0; i < n*n; i++) {
|
||||||
P[i] = (rand() % 100 < OBSTACLE_PROB) ? -1 : 0;
|
P[i] = (rand() % 100 < OBSTACLE_PROB) ? -1 : 0;
|
||||||
}
|
}
|
||||||
P[0] = 0; // Гарантируем, что старт свободен
|
P[START_X + START_Y * MATRIX_SIZE] = 0; // Гарантируем, что старт свободен
|
||||||
P[n*n - 1] = 0; // Гарантируем, что финиш свободен
|
P[FINISH_X + FINISH_Y * MATRIX_SIZE] = 0; // Гарантируем, что финиш свободен
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_distance_map(int* P, unsigned int* dist, int n) {
|
void print_distance_map(int* P, unsigned int* dist, int n) {
|
||||||
@@ -53,9 +58,9 @@ void print_distance_map(int* P, unsigned int* dist, int n) {
|
|||||||
int idx = i * n + j;
|
int idx = i * n + j;
|
||||||
if (P[idx] == -1)
|
if (P[idx] == -1)
|
||||||
printf("████"); // Препятствие
|
printf("████"); // Препятствие
|
||||||
else if (i == 0 && j == 0)
|
else if (i == START_X && j == START_Y)
|
||||||
printf("S "); // Старт
|
printf("S "); // Старт
|
||||||
else if (i == n-1 && j == n-1)
|
else if (i == FINISH_X && j == FINISH_Y)
|
||||||
printf("F "); // Финиш
|
printf("F "); // Финиш
|
||||||
else if (dist[idx] == INF)
|
else if (dist[idx] == INF)
|
||||||
printf(". "); // Недостижимая область
|
printf(". "); // Недостижимая область
|
||||||
@@ -85,7 +90,7 @@ int main() {
|
|||||||
// Инициализация расстояний
|
// Инициализация расстояний
|
||||||
unsigned int* dist = (unsigned int*)malloc(n*n*sizeof(unsigned int));
|
unsigned int* dist = (unsigned int*)malloc(n*n*sizeof(unsigned int));
|
||||||
for (int i = 0; i < n*n; i++) dist[i] = INF;
|
for (int i = 0; i < n*n; i++) dist[i] = INF;
|
||||||
dist[0] = 0; // Стартовая точка
|
dist[START_X + START_Y * MATRIX_SIZE] = 0; // Стартовая точка
|
||||||
|
|
||||||
// Копирование данных на GPU
|
// Копирование данных на GPU
|
||||||
cudaMemcpy(d_P, P, n*n*sizeof(int), cudaMemcpyHostToDevice);
|
cudaMemcpy(d_P, P, n*n*sizeof(int), cudaMemcpyHostToDevice);
|
||||||
@@ -121,10 +126,10 @@ int main() {
|
|||||||
|
|
||||||
// Проверка результата
|
// Проверка результата
|
||||||
cudaMemcpy(dist, d_dist, n*n*sizeof(unsigned int), cudaMemcpyDeviceToHost);
|
cudaMemcpy(dist, d_dist, n*n*sizeof(unsigned int), cudaMemcpyDeviceToHost);
|
||||||
if (dist[n*n - 1] == INF) {
|
if (dist[FINISH_X + FINISH_Y * MATRIX_SIZE] == INF) {
|
||||||
printf("Path not found!\n");
|
printf("Path not found!\n");
|
||||||
} else {
|
} else {
|
||||||
printf("Success! Path length: %u\n", dist[n*n - 1]);
|
printf("Success! Path length: %u\n", dist[FINISH_X + FINISH_Y * MATRIX_SIZE]);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Time: %.2f ms\n", milliseconds);
|
printf("Time: %.2f ms\n", milliseconds);
|
||||||
|
|||||||
Reference in New Issue
Block a user