-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCCC '00 S4 - Golf.cpp
81 lines (62 loc) · 1.79 KB
/
CCC '00 S4 - Golf.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
//
// CCC '00 S4 - Golf.cpp
// link: https://dmoj.ca/problem/ccc00s4
#include <stdio.h>
#include <vector>
#include <iostream>
using namespace std;
struct node{
node(int getHere, int distance){
this->getHere = getHere;
this->distance = distance;
total = getHere+distance;
}
int getHere;
int distance;
int total;
};
vector<node*> openNodes;
vector<int> clubs;
node* openNode(int id){
//open id
for (int i = 0; i < clubs.size(); i++) {
if(openNodes[id]->distance-clubs[i]>=0){ // not out of range
node*newNode = new node(openNodes[id]->getHere+1, openNodes[id]->distance-clubs[i]);
openNodes.push_back(newNode);
if(newNode->distance == 0){
return newNode; // found the best path
}
}
}
delete openNodes[id];
openNodes.erase(openNodes.begin()+id);
if(openNodes.size()==0){
return new node(-1,-1); // there are no more open nodes
}
int lowestCostNode = 0;
for (int i = 1; i < openNodes.size(); i++) {
if(openNodes[lowestCostNode]->total > openNodes[i]->total){
// this may be wrong
lowestCostNode = i;
}
}
return openNode(lowestCostNode);
}
int main(){
int amountOfClubs;
int disFrom;
cin>>disFrom>>amountOfClubs;
for (int i = 0; i < amountOfClubs; i++) {
int clubDis;
cin>>clubDis;
clubs.push_back(clubDis);
}
node*firstNode = new node(0, disFrom);
openNodes.push_back(firstNode);
node* finalID = openNode(0);
if(finalID->getHere!=-1){
cout<<"Roberta wins in "<<finalID->getHere<<" strokes."<<endl;
}else{
cout<<"Roberta acknowledges defeat."<<endl;
}
}