diff --git a/C++ProjectTemplate b/C++ProjectTemplate index 273b5a0..1f631c4 100755 Binary files a/C++ProjectTemplate and b/C++ProjectTemplate differ diff --git a/main.cpp b/main.cpp index 45c4e3c..c1a3e55 100644 --- a/main.cpp +++ b/main.cpp @@ -8,95 +8,64 @@ struct Blueprint{ int oreRobotCost,clayRobotCost,obsidianRobotCost1,obsidianRobotCost2,geodeRobotCost1,geodeRobotCost2; }; -int runSimulation(Blueprint print){ - int minute=0; - int ore=0,clay=0,obsidian=0,geodes=0; - int oreRobots=1/*We start with 1 free ore robot*/,clayRobots=0,obsidianRobots=0,geodeRobots=0; - - int oreRequired=print.oreRobotCost+print.clayRobotCost+print.obsidianRobotCost1+print.geodeRobotCost1; - int clayRequired=print.obsidianRobotCost2; - int obsidianRequired=print.geodeRobotCost2; - int geodeRequired=print.geodeRobotCost2; - - int totalRequired=oreRequired+clayRequired+obsidianRequired+1; +enum Priority{ + OREROBOT, + CLAYROBOT, + OBSIDIANROBOT, +}; - float oreRatio=(float)oreRequired/totalRequired; - float clayRatio=(float)clayRequired/totalRequired; - float obsidianRatio=(float)obsidianRequired/totalRequired; - float geodeRatio=(float)1/totalRequired; +std::string prioToName(Priority p){ + switch(p){ + case OREROBOT:{ + return "Ore Robot"; + }break; + case CLAYROBOT:{ + return "Clay Robot"; + }break; + case OBSIDIANROBOT:{ + return "Obsidian Robot"; + }break; + } +} - float orePct=0; - float clayPct=0; - float obsidianPct=0; - float geodePct=0; +std::string bestHistory=""; - for (int i=0;i<24;i++){ +void runSimulation(Blueprint print, int minute, int ore, int clay, int obsidian, int geodes, int oreRobots, int clayRobots, int obsidianRobots, int geodeRobots, int&bestGeodes, std::string history){ + for (;minute<32;minute++){ //Find out total robots needed for one geode robot. //Geode: 2ore:19obsidian //Obsidian 4ore:7clay //Clay 4ore //Ore 4ore - std::cout<<"Minute "<=print.geodeRobotCost1&&obsidian>=print.geodeRobotCost2){ + runSimulation(print,minute+1,ore-print.geodeRobotCost1+oreRobots,clay+clayRobots,obsidian-print.geodeRobotCost2+obsidianRobots,geodes+geodeRobots,oreRobots,clayRobots,obsidianRobots,geodeRobots+1,bestGeodes,history+"->GEO"); + } else + if (ore>=print.obsidianRobotCost1&&clay>=print.obsidianRobotCost2){ + runSimulation(print,minute+1,ore-print.obsidianRobotCost1+oreRobots,clay-print.obsidianRobotCost2+clayRobots,obsidian+obsidianRobots,geodes+geodeRobots,oreRobots,clayRobots,obsidianRobots+1,geodeRobots,bestGeodes,history+"->OBS"); + } else { + if(ore>=print.oreRobotCost){ + runSimulation(print,minute+1,ore-print.oreRobotCost+oreRobots,clay+clayRobots,obsidian+obsidianRobots,geodes+geodeRobots,oreRobots+1,clayRobots,obsidianRobots,geodeRobots,bestGeodes,history+"->ORE"); + } + if (ore>=print.clayRobotCost){ + runSimulation(print,minute+1,ore-print.clayRobotCost+oreRobots,clay+clayRobots,obsidian+obsidianRobots,geodes+geodeRobots,oreRobots,clayRobots+1,obsidianRobots,geodeRobots,bestGeodes,history+"->CLA"); + } + } + ore+=oreRobots; clay+=clayRobots; obsidian+=obsidianRobots; geodes+=geodeRobots; - if (oreRobots>0){ - std::cout<<"Collected "<0){ - std::cout<<"Collected "<0){ - std::cout<<"Collected "<0){ - std::cout<<"Collected "<=print.geodeRobotCost1&&obsidian>=print.geodeRobotCost2&&geodePct=print.obsidianRobotCost1&&clay>=print.obsidianRobotCost2&&obsidianPct=print.oreRobotCost&&orePct=print.clayRobotCost&&clayPctbestGeodes){ + bestGeodes=geodes; + bestHistory=history; } - return geodes; } int main() @@ -147,9 +116,15 @@ int main() } } int sum=0; - for (int i=0;i