模拟题,注意不需要移动的情况要特殊输出

#include <cstdio> #include <cstring> #include <cstdlib> using namespace std; #define MAX_CLUSTER_NUM 10005 int cluster_num, file_num; int link[MAX_CLUSTER_NUM]; bool is_free[MAX_CLUSTER_NUM]; int total_length; bool optimized; void input() { memset(link, -1, sizeof(link)); scanf("%d%d", &cluster_num, &file_num); for (int i = 0; i < cluster_num; i++) is_free[i] = true; int target_pos = 0; total_length = 0; for (int i = 0; i < file_num; i++) { int file_part_num; scanf("%d", &file_part_num); total_length += file_part_num; for (int j = 0; j < file_part_num; j++) { int original_pos; scanf("%d", &original_pos); original_pos--; link[target_pos] = original_pos; target_pos++; is_free[original_pos] = false; } } } int drag(int start_point, int end_pos) { optimized = true; int next_point; while (link[start_point] != end_pos) { next_point = link[start_point]; printf("%d %d ", next_point + 1, start_point + 1); link[start_point] = -1; is_free[start_point] = false; is_free[next_point] = true; start_point = next_point; } return start_point; } void work() { optimized = false; for (int i = 0; i < total_length; i++) if (is_free[i]) drag(i, -1); for (int i = 0; i < total_length; i++) { if (link[i] != -1 && link[i] != i) { printf("%d %d ", i + 1, total_length + 1); is_free[i] = true; is_free[total_length - 1] = false; int last_pos = drag(i, i); link[last_pos] = -1; printf("%d %d ", total_length + 1, last_pos + 1); is_free[last_pos] = false; is_free[total_length - 1] = true; } } if (!optimized) printf("No optimization needed "); } int main() { input(); work(); return 0; }