数据结构-图-C语言-PTA-Saving James Bond - Easy Version

Data Structures and Algorithms (English)

7-10 Saving James Bond - Easy Version

以下为自己写的版本,难过的是测试点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;
};

/*
*@program 判断是否能跳到鳄鱼上,Complete
*/
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;
}
/*
*@program 判断是否能跳到岸边,Complete
*/
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;
}
/*
*@program 判断在岛上是否能跳到鳄鱼上,Complete
*/
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;
}
/*
*@program 深度遍历图
*/
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() {
	/*initialization Start*/
	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;
	}
	/*initialization End*/

	/* 可以直接从孤岛上提到岸上 直接输出 */
	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; /* 记录007能否安全逃生~~ */
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) { /* 判断2个点距离是否在跳跃能力内 */
        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) {  /* 当007处于孤岛时 第一次可以选择跳的鳄鱼 因为第一次判断能否跳跃的计算方法与后面dfs不相同 所以要单独写 */
    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;
}

猜你喜欢

转载自blog.csdn.net/qq_40925226/article/details/83617828