Advertisement
ccbeginner

CS2351

Apr 13th, 2024 (edited)
747
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.26 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef struct node
  4. {
  5.     int val;
  6.     int damage;
  7.     int health;
  8.     int level;
  9.     struct node *prev;
  10.     struct node *next;
  11. }Node;
  12.  
  13. // 整個 linked list ,目前的某一個點
  14. Node *current;
  15. int list_size = 0;
  16.  
  17. void evolve(Node *newnode);
  18. void delete_node(Node *node);
  19.  
  20.  
  21.  
  22. void attack(Node *newnode)
  23. {
  24.     if (newnode->prev != newnode->next)
  25.         newnode->prev->health-=newnode->damage;
  26.     newnode->next->health-=newnode->damage;
  27. }
  28.  
  29. void insert_instance(int idx, int damage,int health,string stance){
  30.     Node *newnode = new Node;
  31.     newnode -> val = idx;
  32.     newnode -> damage = damage;
  33.     newnode -> health = health;
  34.     newnode -> level = 1;
  35.     if(current==NULL)//只有Newnode一個點
  36.     {
  37.         current = newnode;
  38.         newnode->next=current;
  39.         current->prev=newnode;
  40.     }
  41.     else if(current->prev!=NULL || current->next!=NULL)//?DLL的插入
  42.     {
  43.         newnode->next=current;
  44.         current->prev->next=newnode;
  45.         newnode->prev=current->prev;
  46.         current->prev=newnode;
  47.     }
  48.     list_size++;
  49.    
  50.     if(stance=="Attack")
  51.     {
  52.         attack(newnode);
  53.         if(newnode->prev->health<=0)
  54.         {
  55.             delete_node(newnode->prev);
  56.         }
  57.         if(newnode->next->health<=0)
  58.         {
  59.             delete_node(newnode->next);
  60.         }
  61.     }
  62.     if(stance == "Evolve"){
  63.         evolve(newnode);
  64.     }
  65. }
  66.  
  67.  
  68. void evolve(Node *newnode){
  69.     if(list_size >= 3 && newnode->val==newnode->prev->val && newnode->val==newnode->next->val
  70.     && newnode->prev->level < 3 && newnode->next->level < 3)
  71.     {
  72.         //找最大值
  73.         int max_damage=newnode->damage;
  74.         int max_health=newnode->health;
  75.         int max_level=newnode->level;
  76.         max_damage = max(max_damage, newnode->prev->damage);
  77.         max_damage = max(max_damage, newnode->next->damage);
  78.         max_health = max(max_health, newnode->prev->health);
  79.         max_health = max(max_health, newnode->next->health);
  80.         max_level = max(max_level, newnode->prev->level);
  81.         max_level = max(max_level, newnode->next->level);
  82.         max_level += 1;
  83.  
  84.         // delete 2 node
  85.         delete_node(current->prev);
  86.         delete_node(current->prev);
  87.  
  88.         // 確保current指到剩下的那個點
  89.         // 賦值
  90.         current->damage = max_damage;
  91.         current->health = max_health;
  92.         current->level = max_level;
  93.     }
  94. }
  95.  
  96. // delete current node
  97. void delete_node(Node *node) // node ready to be delete
  98. {
  99.     if(current==NULL)
  100.     {
  101.         return;
  102.     }
  103.     else if(list_size == 1){
  104.         current=NULL;
  105.         list_size = 0;
  106.     }
  107.     else if(node == current)
  108.     {
  109.         Node *temp=current;
  110.         current->prev->next=current->next;
  111.         current->next->prev=current->prev;
  112.         current=current->next;
  113.         free(temp);
  114.         list_size--;
  115.     }else{
  116.         node->prev->next=node->next;
  117.         node->next->prev=node->prev;
  118.         free(node);
  119.         list_size--;
  120.     }
  121. }
  122.  
  123. vector<int> v;
  124. vector<int> dup_nums;
  125. void check(int num) //?
  126. {
  127.     // 揪出重複的數字
  128.     Node *temp=current;
  129.     v.clear();
  130.     dup_nums.clear();
  131.     for(int i=0;i<num;i++)
  132.     {
  133.         int val=temp->val;
  134.         v.push_back(val);
  135.         temp = temp->next;
  136.     }
  137.  
  138.     // 找出重複數字
  139.     sort(v.begin(), v.end());
  140.     for(int i=1;i<v.size();i++){
  141.         if(v[i] == v[i-1]){
  142.             if(dup_nums.empty() || dup_nums.back() != v[i]){
  143.                 dup_nums.push_back(v[i]);
  144.             }
  145.         }
  146.     }
  147.  
  148.     // 刪除重複數字
  149.     temp=current;
  150.     for(int i=0;i<num;i++)
  151.     {
  152.         //判斷temp->val是否出現在dup_nums裡面
  153.         auto low_bound = lower_bound(dup_nums.begin(), dup_nums.end(), temp->val);
  154.         if(low_bound == dup_nums.end() || *low_bound != temp->val){
  155.             // 不重複
  156.         }else{
  157.             //重複,刪除current
  158.             if (temp == current){
  159.                 delete_node(temp);
  160.                 temp = current;
  161.             }else{
  162.                 delete_node(temp);
  163.             }
  164.         }
  165.         temp = temp->next;
  166.     }
  167. }
  168.  
  169. void Shuffle(char dir, int num)
  170. {
  171.     Node *temp=current;
  172.     if(dir=='c')//順時針方向
  173.     {
  174.         for(int i=0;i<num;i++)
  175.         {
  176.             temp=temp->next;
  177.         }
  178.         //交換值就好
  179.         swap(current->val,temp->val);//swap是否會將指標交換?
  180.         swap(current->health,temp->health);//swap是否會將指標交換?
  181.         swap(current->damage,temp->damage);//swap是否會將指標交換?
  182.         swap(current->level,temp->level);//swap是否會將指標交換?
  183.         current = temp;
  184.     }
  185.     if(dir=='a')
  186.     {
  187.         for(int i=0;i<num;i++)
  188.         {
  189.             temp=temp->prev;
  190.         }
  191.         //交換節點(只動next, prev)
  192.         Node *current_next = current->next;
  193.         Node *current_prev = current->prev;
  194.         Node *temp_next = temp->next;
  195.         Node *temp_prev = temp->prev;
  196.         //更新current,temp的指針
  197.         swap(current->next,temp->next);
  198.         swap(current->prev,temp->prev);
  199.         // 更新current,temp前後節點的指針
  200.         current_next->prev = temp;
  201.         current_prev->next = temp;
  202.         temp_next->prev = current;
  203.         temp_prev->next = current;
  204.     }
  205. }
  206.  
  207. void reverse_segment(Node *start, int seg_size){
  208.     if (seg_size == 1) return;
  209.     Node *prev = start->prev;
  210.     Node *next = start->next;
  211.     Node *last = start;
  212.     for(int i = 0; i < seg_size-1; i++){
  213.         Node *temp = next->next;
  214.         last->prev = next;
  215.         next->next = last;
  216.         last = last->next;
  217.         next = temp;
  218.     }
  219.     prev->next = last;
  220.     last->prev = prev;
  221.     start->next = next;
  222.     next->prev = start;
  223.     if (current == start){
  224.         current = last;
  225.     }
  226. }
  227.  
  228. void reverse_ll(int num)
  229. {
  230.     if (num >= list_size){
  231.         //reverse all
  232.     }else{
  233.         Node *tmp = current;
  234.         for(int i = 0; i < list_size / num; i++){
  235.             reverse_segment(tmp, num);
  236.             for(int j = 0; j < num; j++){
  237.                 tmp = tmp->next;
  238.             }
  239.         }
  240.         if (list_size % num > 0){
  241.             reverse_segment(tmp, list_size % num);
  242.         }
  243.     }
  244. }
  245.  
  246. void print_list(){
  247.     cout << "list: \n";
  248.     for (int i = 0; i < list_size; i++){
  249.         cout<<"ID: "<<current->val<<"HP: "<<current->health<<"LVL: "<<current->level<<"\n";
  250.         current = current -> next;
  251.     }
  252. }
  253.  
  254. int main()
  255. {
  256.     int n,x,y,z;
  257.     string cmd, option;
  258.     char dir;
  259.     cin >> n;
  260.     while(n--){
  261.         cin >> cmd;
  262.         if(cmd == "Insert"){
  263.             cin >> x >> y >> z >> option;
  264.             insert_instance(x, y, z, option);
  265.         }else if(cmd == "Delete"){
  266.             delete_node(current);
  267.         }else if(cmd == "Shuffle"){
  268.             cin >> dir >> x;
  269.             Shuffle(dir, x);
  270.         }else if(cmd == "Check"){
  271.             cin >> x;
  272.             check(x);
  273.         }else if(cmd == "Reverse"){
  274.             cin >> x;
  275.             reverse_ll(x);
  276.         }
  277.         print_list();
  278.     }
  279.     cout << "ans\n";
  280.     for (int i = 0; i < list_size; i++){
  281.         cout<<"ID: "<<current->val<<"HP: "<<current->health<<"LVL: "<<current->level<<"\n";
  282.         current = current -> next;
  283.     }
  284.     return 0;
  285. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement