From 8eb2e077491e68f92b06c40e5a74062793700cd1 Mon Sep 17 00:00:00 2001 From: happyZYM Date: Sat, 25 May 2024 05:46:20 +0000 Subject: [PATCH] finish writing, ready to debug --- src/include/engine.h | 2 +- src/transaction_system.cpp | 58 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/src/include/engine.h b/src/include/engine.h index 2fd09c9..d61778f 100644 --- a/src/include/engine.h +++ b/src/include/engine.h @@ -56,7 +56,7 @@ class TicketSystemEngine { std::string &res_train2_id, int &res_train1_leaving_time_stamp, int &res_train1_arriving_time_stamp, int &res_train2_leaving_time_stamp, int &res_train2_arriving_time_stamp, int &res_train1_price, int &res_train1_seat, - int &res_train2_price, int &res_train2_seat, std::string &res_transfer_station_name); + int &res_train2_price, int &res_train2_seat, std::string &res_transfer_station_name, bool sort_by_time); public: const bool *its_time_to_exit_ptr = &its_time_to_exit; diff --git a/src/transaction_system.cpp b/src/transaction_system.cpp index a750ea5..67f00a5 100644 --- a/src/transaction_system.cpp +++ b/src/transaction_system.cpp @@ -182,7 +182,7 @@ std::string TicketSystemEngine::QueryTransfer(const std::string &command) { CheckTransfer(trains_leaving_from_from[i], trains_arriving_at_dest[j], from, to, date, has_solution, train1_id, train2_id, train1_leaving_time_stamp, train1_arriving_time_stamp, train2_leaving_time_stamp, train2_arriving_time_stamp, train1_price, train1_seats, train2_price, train2_seats, - transfer_station_id); + transfer_station_id, order_by[0] == 't'); } } if (!has_solution) { @@ -209,7 +209,8 @@ void TicketSystemEngine::CheckTransfer(hash_t train1_ID_hash, hash_t train2_ID_h int &res_train1_leaving_time_stamp, int &res_train1_arriving_time_stamp, int &res_train2_leaving_time_stamp, int &res_train2_arriving_time_stamp, int &res_train1_price, int &res_train1_seat, int &res_train2_price, - int &res_train2_seat, std::string &res_transfer_station_name) { + int &res_train2_seat, std::string &res_transfer_station_name, + bool sort_by_time) { std::map transfer_mp; hash_t from_station_hash = SplitMix64Hash(from_station), to_station_hash = SplitMix64Hash(to_station); CoreTrainData train1_core_data, train2_core_data; @@ -315,7 +316,58 @@ void TicketSystemEngine::CheckTransfer(hash_t train1_ID_hash, hash_t train2_ID_h for (int j = i + 1; j < dest_station_offset; j++) { res_train2_seat = std::min(res_train2_seat, (int)train2_seats_data.seat[j]); } - return; + } else { + int cur_total_time = cur_train2_arriving_time_stamp - cur_train1_leaving_time_stamp; + int existsing_total_time = res_train2_arriving_time_stamp - res_train1_leaving_time_stamp; + int cur_total_price = train1_price_sum[transfer_station_offset] - train1_price_sum[start_station_offset] + + train2_price_sum[dest_station_offset] - train2_price_sum[i]; + int existing_total_price = res_train1_price + res_train2_price; + int status; + if (sort_by_time) { + if (existsing_total_time < cur_total_time) continue; + if (existsing_total_time > cur_total_time) goto passed_test; + if (existing_total_price < cur_total_price) continue; + if (existing_total_price > cur_total_price) goto passed_test; + } else { + if (existing_total_price < cur_total_price) continue; + if (existing_total_price > cur_total_price) goto passed_test; + if (existsing_total_time < cur_total_time) continue; + if (existsing_total_time > cur_total_time) goto passed_test; + } + status = strcmp(res_train1_id.c_str(), train1_price_data.trainID); + if (status < 0) continue; + if (status > 0) goto passed_test; + status = strcmp(res_train2_id.c_str(), train2_price_data.trainID); + if (status < 0) continue; + if (status > 0) goto passed_test; + passed_test:; + res_train1_id = train1_price_data.trainID; + res_train2_id = train2_price_data.trainID; + res_train1_leaving_time_stamp = cur_train1_leaving_time_stamp; + res_train1_arriving_time_stamp = cur_train1_arriving_time_stamp; + res_train2_leaving_time_stamp = cur_train2_leaving_time_stamp; + res_train2_arriving_time_stamp = cur_train2_arriving_time_stamp; + res_train1_price = train1_price_sum[transfer_station_offset] - train1_price_sum[start_station_offset]; + res_train2_price = train2_price_sum[dest_station_offset] - train2_price_sum[i]; + StationNameData station_name_data; + station_name_data_storage.Get(train1_ID_hash, station_name_data); + auto &str = station_name_data.name[transfer_station_offset]; + res_transfer_station_name = ""; + for (int i = 0; i < 40 && str[i] != '\0'; i++) res_transfer_station_name.push_back(str[i]); + SeatsData train1_seats_data, train2_seats_data; + seats_data_storage.Get({train1_ID_hash, train1_actual_start_date - train1_core_data.saleDate_beg}, + train1_seats_data); + int train2_actual_start_date = cur_train2_leaving_time_stamp / 1440; + seats_data_storage.Get({train2_ID_hash, train2_actual_start_date - train2_core_data.saleDate_beg}, + train2_seats_data); + res_train1_seat = train1_seats_data.seat[start_station_offset]; + for (int j = start_station_offset + 1; j < transfer_station_offset; j++) { + res_train1_seat = std::min(res_train1_seat, (int)train1_seats_data.seat[j]); + } + res_train2_seat = train2_seats_data.seat[i]; + for (int j = i + 1; j < dest_station_offset; j++) { + res_train2_seat = std::min(res_train2_seat, (int)train2_seats_data.seat[j]); + } } } }