diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..f1f9efd --- /dev/null +++ b/main.cpp @@ -0,0 +1,382 @@ +#include +#include +#include +#include +#include "HRD_cal.h" +#include "HRD_analy.h" +#include "HRD_group.h" +#include "HRD_statistic.h" +using namespace std; + +ofstream File_Output; + +unsigned long long checked_code; + +bool code_check(string str) { + HRD_cal cal; + char code_str[10]; + if (str.length() != 9) { + return false; + } + for (unsigned int i = 0; i < str.length(); i++) { + code_str[i] = str[i]; + } + code_str[10] = '\0'; + checked_code = cal.Change_int(code_str); + return cal.Check_Code(checked_code); +} + +void cal_case(string str) { + unsigned long long code; + vector dat; + if (code_check(str) == false) { + cout << "code error" << endl; + cout << endl; + return; + } + HRD_cal cal; + code = checked_code; + cout << "Start code: " << cal.Change_str(code) << endl; + dat = cal.Calculate(code); + if (dat.size() == 0) { + cout << "no solution" << endl; + } else { + cout << "At least need " << dat.size() - 1 << " step:" << endl; + } + for (unsigned int i = 0; i < dat.size(); i++) { + cout << i << ": " << cal.Change_str(dat[i]) << endl; + } + cout << endl; +} + +void cal_case(string str, string File_name) { + unsigned long long code; + vector dat; + if (code_check(str) == false) { + cout << "code error" << endl; + cout << endl; + return; + } + HRD_cal cal; + code = checked_code; + cout << "Start code: " << cal.Change_str(code) << endl; + dat = cal.Calculate(code); + if (dat.size() == 0) { + cout << "no solution" << endl; + } else { + cout << "At least need " << dat.size() - 1 << " step" << endl; + } + File_Output.open(File_name); + cout << "Data save at " << File_name << endl; + File_Output << dat.size() - 1 << endl; + for (unsigned int i = 0; i < dat.size(); i++) { + File_Output << cal.Change_str(dat[i]); + if (i + 1 != dat.size()) { + File_Output << endl; + } + } + cout << endl; + File_Output.close(); +} + +void cal_target(string str_1, string str_2) { + unsigned long long code, target; + vector dat; + if (code_check(str_1) == false) { + cout << "code error" << endl; + cout << endl; + return; + } + code = checked_code; + if (code_check(str_2) == false) { + cout << "code error" << endl; + cout << endl; + return; + } + target = checked_code; + HRD_cal cal; + cout << "Start code: " << cal.Change_str(code) << endl; + cout << "Target code: " << cal.Change_str(target) << endl; + dat = cal.Calculate(code, target); + if (dat.size() == 0) { + cout << "no solution" << endl; + } else { + cout << "At least need " << dat.size() - 1 << " step:" << endl; + } + for (unsigned int i = 0; i < dat.size(); i++) { + cout << i << ": " << cal.Change_str(dat[i]) << endl; + } + cout << endl; +} + +void cal_target(string str_1, string str_2, string File_name) { + unsigned long long code, target; + vector dat; + if (code_check(str_1) == false) { + cout << "code error" << endl; + cout << endl; + return; + } + code = checked_code; + if (code_check(str_2) == false) { + cout << "code error" << endl; + cout << endl; + return; + } + target = checked_code; + HRD_cal cal; + cout << "Start code: " << cal.Change_str(code) << endl; + cout << "Target code: " << cal.Change_str(target) << endl; + dat = cal.Calculate(code, target); + if (dat.size() == 0) { + cout << "no solution" << endl; + } else { + cout << "At least need " << dat.size() - 1 << " step" << endl; + } + File_Output.open(File_name); + cout << "Data save at " << File_name << endl; + File_Output << dat.size() - 1 << endl; + for (unsigned int i = 0; i < dat.size(); i++) { + File_Output << cal.Change_str(dat[i]); + if (i + 1 != dat.size()) { + File_Output << endl; + } + } + cout << endl; + File_Output.close(); +} + +void cal_group(string str, string File_name) { + unsigned long long code; + vector dat; + if (code_check(str) == false) { + cout << "code error" << endl; + cout << endl; + return; + } + HRD_cal cal; + code = checked_code; + cout << "Start code: " << cal.Change_str(code) << endl; + dat = cal.Calculate_All(code); + sort(dat.begin(), dat.end()); + cout << "Group size: " << dat.size() << endl; + File_Output.open(File_name); + cout << "Data save at " << File_name << endl; + for (unsigned int i = 0; i < dat.size(); i++) { + File_Output << cal.Change_str(dat[i]); + if (i + 1 != dat.size()) { + File_Output << endl; + } + } + cout << endl; + File_Output.close(); +} + +void analy_case(string str, string File_name, bool quiet) { + unsigned long long code; + vector dat; + if (code_check(str) == false) { + cout << "code error" << endl; + cout << endl; + return; + } + HRD_analy analy; + code = checked_code; + cout << "Start code: " << analy.Change_str(code) << endl; + analy.quiet = quiet; + analy.Analyse_Case(code); + if (quiet == true) { + cout << "Output into " << File_name << "..."; + } + analy.Output_Detail(File_name); + if (quiet == true) { + cout << "done" << endl; + } + cout << endl; +} + +void analy_group(string str, string File_name_1, string File_name_2, bool is_all) { + unsigned long long code; + vector dat; + if (code_check(str) == false) { + cout << "code error" << endl; + cout << endl; + return; + } + HRD_group group; + code = checked_code; + cout << "Start code: " << group.Change_str(code) << endl; + group.Batch_Analyse(code, File_name_1, File_name_2, is_all); + cout << "Data save at " << File_name_1 << " and " << File_name_2 << endl; + cout << endl; +} + +void find_all(string File_name) { + HRD_statistic statistic; + cout << "Warning: It will consume nearly 2GB of memory, please make sure there is enough memory!" << endl; + cout << "Press ENTER to start..."; + cin.get(); + statistic.Find_All_Case(File_name); + cout << "Data save at " << File_name << endl; + cout << endl; +} + +void find_all_code(string File_name) { + HRD_statistic statistic; + cout << "Warning: It will consume nearly 2GB of memory, please make sure there is enough memory!" << endl; + cout << "Press ENTER to start..."; + cin.get(); + statistic.Make_main_table(File_name); + cout << "Data save at " << File_name << endl; + cout << endl; +} + +void show_help() { + cout << "(version: v0.0)" << endl; + cout << "Usage of HRD_engine:" << endl; + cout << endl; + cout << " --cal [file_name]" << endl; + cout << " [file_name]: for output the result" << endl; + cout << " Purpose: find the min step solution from " << endl; + cout << " exp: ./engine --cal 1A9BF0C00" << endl; + cout << " ./engine --cal 1A9BF0C00 demo.txt" << endl; + cout << endl; + cout << " --cal-target [file_name]" << endl; + cout << " [file_name]: for output the result" << endl; + cout << " Purpose: find the min step path from to " << endl; + cout << " exp: ./engine --cal-target 4FEA13400 43EA73400" << endl; + cout << " ./engine --cal-target 4FEA13400 43EA73400 demo.txt" << endl; + cout << endl; + cout << " --group " << endl; + cout << " : for output the result" << endl; + cout << " Purpose: find all cases in the group where loacted" << endl; + cout << " exp: ./engine --group 4FEA13400 demo.txt" << endl; + cout << endl; + cout << " --analy " << endl; + cout << " : for output the result" << endl; + cout << " Purpose: analyse the case with " << endl; + cout << " exp: ./engine --analy 1A9BF0C00 demo.txt" << endl; + cout << endl; + cout << " --analy-quiet " << endl; + cout << " Purpose: the same function with analy but don't show the process" << endl; + cout << " exp: ./engine --analy-quiet 1A9BF0C00 demo.txt" << endl; + cout << endl; + cout << " --analy-group " << endl; + cout << " : for output the result of \"farthest\"" << endl; + cout << " : for output the result of \"solution\"" << endl; + cout << " Purpose: analyse all cases in the group where loacted" << endl; + cout << " exp: ./engine --group 1A9BF0C00 farthest.csv solution.csv" << endl; + cout << endl; + cout << " --analy-group-all " << endl; + cout << " Purpose: the same function with analy-group but more output all solution cases" << endl; + cout << " exp: ./engine --group-all 1A9BF0C00 farthest.csv solution.csv" << endl; + cout << endl; + cout << " --all " << endl; + cout << " Purpose: find all cases from klotski game with detail" << endl; + cout << " exp: ./engine --all main.csv" << endl; + cout << endl; + cout << " --all-code " << endl; + cout << " Purpose: find all cases from klotski game only with code" << endl; + cout << " exp: ./engine --all-code All_Case.txt" << endl; + cout << endl; + cout << " --help" << endl; + cout << " Purpose: show the usage" << endl; + cout << " exp: ./engine --help" << endl; + cout << endl; +} + +int main(int argc, char* argv[]) { + cout << "Klotski engine by Dnomd343" << endl; + if (argc <= 1) { + cout << "no parameter" << endl; + cout << "You can try to use \"--help\" for more information" << endl; + cout << endl; + return 0; + } + string parameter; + parameter = argv[1]; + if (parameter == "--cal") { + if (argc == 3) { + cal_case(argv[2]); + } else if (argc == 4) { + cal_case(argv[2], argv[3]); + } else { + cout << "parameter error" << endl; + cout << endl; + return 0; + } + } else if (parameter == "--cal-target") { + if (argc == 4) { + cal_target(argv[2], argv[3]); + } else if (argc == 5) { + cal_target(argv[2], argv[3], argv[4]); + } else { + cout << "parameter error" << endl; + cout << endl; + return 0; + } + } else if (parameter == "--group") { + if (argc == 4) { + cal_group(argv[2], argv[3]); + } else { + cout << "parameter error" << endl; + cout << endl; + return 0; + } + } else if (parameter == "--analy") { + if (argc == 4) { + analy_case(argv[2], argv[3], false); + } else { + cout << "parameter error" << endl; + cout << endl; + return 0; + } + } else if (parameter == "--analy-quiet") { + if (argc == 4) { + analy_case(argv[2], argv[3], true); + } else { + cout << "parameter error" << endl; + cout << endl; + return 0; + } + } else if (parameter == "--analy-group") { + if (argc == 5) { + analy_group(argv[2], argv[3], argv[4], false); + } else { + cout << "parameter error" << endl; + cout << endl; + return 0; + } + } else if (parameter == "--analy-group-all") { + if (argc == 5) { + analy_group(argv[2], argv[3], argv[4], true); + } else { + cout << "parameter error" << endl; + cout << endl; + return 0; + } + } else if (parameter == "--all") { + if (argc == 3) { + find_all(argv[2]); + } else { + cout << "parameter error" << endl; + cout << endl; + return 0; + } + } else if (parameter == "--all-code") { + if (argc == 3) { + find_all_code(argv[2]); + } else { + cout << "parameter error" << endl; + cout << endl; + return 0; + } + } else if (parameter == "--help") { + show_help(); + } else { + cout << "unknow parameter" << endl; + cout << "You can try to use \"--help\" for more information" << endl; + cout << endl; + } + return 0; +}