Data Structures and Algorithms (English)
以下为自己写的版本,难过的是测试点2无法通过
#include <stdio.h>
#include <math.h>
#define MaxSize 100
#define MinLength 42.5
bool answer = false;
int N;
int D;
typedef struct Point *pPoint;
struct Point {
int x;
int y;
bool isVisited;
};
bool isEdge(Point pointA, Point pointB, int D) {
int x = fabs(pointA.x - pointB.x);
int y = fabs(pointB.y - pointA.y);
if (x * x + y * y <= D * D && x + y != 0) return true;
return false;
}
bool isSafe(Point point, int D) {
if (point.x + D >= 50 || point.x - D <= -50) return true;
if (point.y + D >= 50 || point.y - D <= -50) return true;
return false;
}
bool firstJump(Point pointA, pPoint pointB, int D) {
int x = fabs(pointA.x - pointB->x);
int y = fabs(pointB->y - pointA.y);
if (x * x + y * y <= (D + 7.5) * (D + 7.5)) {
pointB->isVisited = true;
return true;
}
return false;
}
bool DFS(Point point, Point points[], int D) {
for (int i = 1; i <= N; i++) {
if (points[i].isVisited) continue;
if (isEdge(point, points[i], D)) {
points[i].isVisited = true;
if (isSafe(points[i], D)) answer = true;
answer = DFS(points[i], points, D);
if(answer==true) break;
}
}
return answer;
}
int main() {
if (scanf("%d %d", &N, &D));
bool isEscaped = false;
Point points[MaxSize];
points[0].x = 0;
points[0].y = 0;
points[0].isVisited = true;
for (int i = 1; i <= N; i += 1) {
scanf("%d %d", &points[i].x, &points[i].y);
points[i].isVisited = false;
}
if (D >= MinLength) {
printf("Yes");
return 0;
}
for (int i = 1; i <= N; i += 1) {
if (firstJump(points[0], &points[i], D)) {
isEscaped = DFS(points[i], points, D);
if (isEscaped) { printf("Yes"); break; }
}
}
if (!isEscaped) printf("No");
return 0;
}
标准答案
#include "math.h"
using namespace std;
int n, m;
#define MINLEN 42.5
struct Pointer {
int x;
int y;
}p[101];
bool answer = false;
bool visited[101] = {false};
bool isSave(int x) {
if ((p[x].x - m <= -50) || (p[x].x + m >= 50) || (p[x].y - m <= -50) || (p[x].y + m >= 50))
return true;
return false;
}
bool jump(int x, int y) {
int p1 = pow(p[x].x - p[y].x, 2);
int p2 = pow(p[x].y - p[y].y, 2);
int r = m * m;
if (p1 + p2 <= r)
return true;
return false;
}
bool firstJump(int x) {
int p1 = pow(p[x].x , 2);
int p2 = pow(p[x].y , 2);
int r = (m+7.5) * (m+7.5);
if (p1 + p2 <= r) {
return true;
}
return false;
}
bool dfs(int x) {
visited[x] = true;
if (isSave(x)) answer = true;
for (int i = 0; i < n; i++) {
if (!visited[i] && jump(x, i)) {
answer = dfs(i);
if (answer == true) break;
}
}
return answer;
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 0; i < n; i++) {
scanf("%d %d", &p[i].x, &p[i].y);
}
if (m >= MINLEN) { printf("Yes");return 0;}
for (int i = 0; i < n; i++) {
if (firstJump(i) && !visited[i]) {
if (dfs(i)) break;
}
}
if (answer == true) printf("Yes");
else printf("No");
return 0;
}