076

DS HW2

076
Apr 6th, 2024 (edited)
41
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.94 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdbool.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5. int poknum;
  6. int max(int _,int __){
  7.     return _>__? _:__;
  8. }
  9. typedef struct poke{
  10.     int id,hp,at,lv;
  11.     struct poke *pre,*nxt;
  12. }pok;
  13. pok* Insert(pok *head){
  14.     poknum++;
  15.     int id,at,hp;
  16.     char cmd[20];
  17.     scanf("%d%d%d%s",&id,&at,&hp,cmd);
  18.     if(poknum==1){
  19.         pok* newpok=(pok*)malloc(sizeof(pok));
  20.         newpok->at=at;
  21.         newpok->id=id;
  22.         newpok->hp=hp;
  23.         newpok->lv=1;
  24.         newpok->pre=newpok;
  25.         newpok->nxt=newpok;
  26.         return newpok;
  27.     }
  28.     if(cmd[0]=='A'){
  29.         if(poknum>2){
  30.             head->pre->hp-=at;
  31.             if(head->pre->hp<=0){
  32.                 poknum--;
  33.                 pok *trash=head->pre;
  34.                 head->pre=trash->pre;
  35.                 head->pre->nxt=head;
  36.                 free(trash);
  37.             }
  38.         }
  39.         if(poknum>1){
  40.             head->hp-=at;
  41.             if(head->hp<=0){
  42.                 poknum--;
  43.                 head->at=at;
  44.                 head->id=id;
  45.                 head->hp=hp;
  46.                 head->lv=1;
  47.             }else{
  48.                 pok* newpok=(pok*)malloc(sizeof(pok));
  49.                 newpok->at=at;
  50.                 newpok->id=id;
  51.                 newpok->hp=hp;
  52.                 newpok->lv=1;
  53.                 newpok->pre=head->pre;
  54.                 newpok->pre->nxt=newpok;
  55.                 newpok->nxt=head;
  56.                 head->pre=newpok;
  57.             }
  58.             return head;
  59.         }
  60.     }else if(cmd[0]=='E'){
  61.         if(poknum>2&&head->id==id&&head->pre->id==id&&head->pre->lv<3&&head->lv<3){
  62.             poknum-=2;
  63.             head->at=max(at,max(head->pre->at,head->at));
  64.             head->hp=max(hp,max(head->pre->hp,head->hp));
  65.             head->lv=max(head->pre->lv,head->lv);
  66.             head->lv++;
  67.             pok *trash=head->pre;
  68.             head->pre=trash->pre;
  69.             trash->pre->nxt=head;
  70.             free(trash);
  71.         }else{
  72.             pok* newpok=(pok*)malloc(sizeof(pok));
  73.             newpok->at=at;
  74.             newpok->id=id;
  75.             newpok->hp=hp;
  76.             newpok->lv=1;
  77.             newpok->pre=head->pre;
  78.             newpok->pre->nxt=newpok;
  79.             newpok->nxt=head;
  80.             head->pre=newpok;
  81.         }
  82.         return head;
  83.     }else{
  84.         pok* newpok=(pok*)malloc(sizeof(pok));
  85.         newpok->at=at;
  86.         newpok->id=id;
  87.         newpok->hp=hp;
  88.         newpok->lv=1;
  89.         newpok->pre=head->pre;
  90.         newpok->pre->nxt=newpok;
  91.         newpok->nxt=head;
  92.         head->pre=newpok;
  93.         return head;
  94.     }
  95. }
  96. pok* Delete(pok *head){
  97.     if(poknum==0) return NULL;
  98.     poknum--;
  99.     pok *trash=head;
  100.     head=head->nxt;
  101.     head->pre=trash->pre;
  102.     trash->pre->nxt=head;
  103.     free(trash);
  104.     return (poknum==0? NULL:head);
  105. }
  106. pok* Shuffle(pok *head){
  107.     char dir[5];
  108.     int n,id,lv,at,hp;
  109.     scanf("%s%d",dir,&n);
  110.     n%=poknum;
  111.     if(n==0) return head;
  112.     pok *aim=head;
  113.     if(dir[0]=='c') while(n--) aim=aim->nxt; else while(n--) aim=aim->pre;
  114.     hp=head->hp;
  115.     at=head->at;
  116.     id=head->id;
  117.     lv=head->lv;
  118.     head->hp=aim->hp;
  119.     head->at=aim->at;
  120.     head->id=aim->id;
  121.     head->lv=aim->lv;
  122.     aim->hp=hp;
  123.     aim->at=at;
  124.     aim->id=id;
  125.     aim->lv=lv;
  126.     return aim;
  127. }
  128. pok* Check(pok *head){
  129.     int x;
  130.     scanf("%d",&x);
  131.     if(x>poknum) x=poknum;
  132.     int num[101],i;
  133.     pok* addr[101][10001];
  134.     memset(num,0,101*sizeof(int));
  135.     pok* now=head;
  136.     while(x--){
  137.         i=now->id;
  138.         addr[i][num[i]++]=now;
  139.         now=now->nxt;
  140.     }
  141.     for(int j=0;j<101;j++) if(num[j]>1){
  142.         for(int k=0;k<num[j];k++){
  143.             if(addr[j][k]==head){
  144.                 head=Delete(addr[j][k]);
  145.             }else{
  146.                 Delete(addr[j][k]);
  147.             }
  148.         }
  149.     }
  150.     return head;
  151. }
  152. void Reverse(pok *head){
  153.     int n;
  154.     scanf("%d",&n);
  155.     if(n<=1) return;
  156.     else if(n>poknum) n=poknum;
  157.     int data[n][4],rem=poknum;
  158.     pok *now=head,*temp;
  159.     while(rem>=n){
  160.         rem-=n;
  161.         temp=now;
  162.         for(int i=0;i<n;i++){
  163.             data[i][0]=now->at;
  164.             data[i][1]=now->hp;
  165.             data[i][2]=now->id;
  166.             data[i][3]=now->lv;
  167.             now=now->nxt;
  168.         }
  169.         now=temp;
  170.         for(int j=n-1;j>=0;j--){
  171.             now->at=data[j][0];
  172.             now->hp=data[j][1];
  173.             now->id=data[j][2];
  174.             now->lv=data[j][3];
  175.             now=now->nxt;
  176.         }
  177.     }
  178.     while(rem>1){
  179.         temp=now;
  180.         for(int i=0;i<rem;i++){
  181.             data[i][0]=now->at;
  182.             data[i][1]=now->hp;
  183.             data[i][2]=now->id;
  184.             data[i][3]=now->lv;
  185.             now=now->nxt;
  186.         }
  187.         now=temp;
  188.         for(int j=rem-1;j>=0;j--){
  189.             now->at=data[j][0];
  190.             now->hp=data[j][1];
  191.             now->id=data[j][2];
  192.             now->lv=data[j][3];
  193.             now=now->nxt;
  194.         }
  195.         rem=0;
  196.     }
  197. }
  198. void solve(){
  199.     int t;
  200.     char cmd[20];
  201.     scanf("%d",&t);
  202.     pok *head=NULL;
  203.     while(t--){
  204.         scanf("%s",cmd);
  205.         switch(cmd[0]){
  206.         case 'I':
  207.             head=Insert(head);
  208.             break;
  209.         case 'D':
  210.             head=Delete(head);
  211.             break;
  212.         case 'S':
  213.             head=Shuffle(head);
  214.             break;
  215.         case 'C':
  216.             head=Check(head);
  217.             break;
  218.         case 'R':
  219.             Reverse(head);
  220.             break;
  221.         default:
  222.             break;
  223.         }
  224.     }
  225.     if(poknum==0){
  226.         puts("no Poke Poke ;-;");
  227.     }else{
  228.         pok *now=head;
  229.         for(int i=0;i<poknum;i++){
  230.             printf("ID: %d HP: %d LVL: %d\n",now->id,now->hp,now->lv);
  231.             now=now->nxt;
  232.         }
  233.     }
  234. }
  235. int main(){
  236.     poknum=0;
  237.     solve();
  238.     return 0;
  239. }
  240. /*
  241. CS2351_DS_24Spring_HW2
  242. https://acm.cs.nthu.edu.tw/contest/2977/
  243. NTHU OJ 14272 - A Trainer's Final Battle
  244. AC code
  245. 2024 April 7
  246. */
Advertisement
Add Comment
Please, Sign In to add comment