日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

[转]NYOJ-511-移动小球

發(fā)布時間:2025/7/25 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转]NYOJ-511-移动小球 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
大學生程序代寫

http://acm.nyist.net/JudgeOnline/problem.php?pid=511

這道題很容易想到要構建一個循環(huán)鏈表來確定每個球的相對位置,就是操作比較繁瑣,考慮情況較多。

首先要創(chuàng)建節(jié)點Node,每個節(jié)點都有一個初始順序order,指向左邊的Node*指針left,何指向右邊的Node*指針right。

[cpp] view plaincopyprint?
  • struct?Node??
  • {??
  • ????int?order;??
  • ????Node?*left,*right;??
  • }node[N];??
  • 然后給每個小球附上順序,并建立和左右的聯(lián)系。

    [cpp] view plaincopyprint?
  • void?build(int?n)??
  • {??
  • ????int?i,order=1;??
  • ????for(i=1;i<n;i++)??
  • ????????{??
  • ????????????node[i].order=i;??
  • ????????????node[i].right=&node[i+1];??
  • ????????????node[i+1].left=&node[i];??
  • ????????}??
  • ????node[1].left=&node[n];??
  • ????node[n].right=&node[1];??
  • ????node[n].order=n;??
  • }???然后就是A、B操作,下邊敘述一下A操作(將x放在y左邊)的實現(xiàn)方法:
  • 1.將x左邊節(jié)點的right指針指向x的右邊節(jié)點

    2.將x右邊節(jié)點的left指針指向x的左邊節(jié)點

    3.將x的right指向y節(jié)點

    4.將x的left指向y左邊的節(jié)點

    5.將y左邊節(jié)點的right指向x節(jié)點

    6.將y的left指向x節(jié)點

    實現(xiàn)代碼:

    [cpp] view plaincopyprint?
  • void?A(int?x,int?y)??
  • {??
  • ????Node?*p=&node[x],*q=&node[y];??
  • ????p->left->right=p->right;??
  • ????p->right->left=p->left;??
  • ????p->left=q->left;??
  • ????p->right=q;??
  • ????q->left->right=p;??
  • ????q->left=p;??
  • }???由于交換位置僅改變節(jié)點的左右指針,并沒有改變數(shù)組的下標(下標其實與order相同),所以查找球號時直接用下標索引。
  • 同理可知操作B。

    完整代碼如下:

    [cpp] view plaincopyprint?
  • #include<stdio.h> ??
  • const?int?N=10005;??
  • struct?Node??
  • {??
  • ????int?order;??
  • ????Node?*left,*right;??
  • }node[N];??
  • void?build(int?n)??
  • {??
  • ????int?i,order=1;??
  • ????for(i=1;i<n;i++)??
  • ????????{??
  • ????????????node[i].order=i;??
  • ????????????node[i].right=&node[i+1];??
  • ????????????node[i+1].left=&node[i];??
  • ????????}??
  • ????node[1].left=&node[n];??
  • ????node[n].right=&node[1];??
  • ????node[n].order=n;??
  • }??
  • void?A(int?x,int?y)??
  • {??
  • ????Node?*p=&node[x],*q=&node[y];??
  • ????p->left->right=p->right;??
  • ????p->right->left=p->left;??
  • ????p->left=q->left;??
  • ????p->right=q;??
  • ????q->left->right=p;??
  • ????q->left=p;??
  • }??
  • void?B(int?x,int?y)??
  • {??
  • ????Node?*p=&node[x],*q=&node[y];??
  • ????p->left->right=p->right;??
  • ????p->right->left=p->left;??
  • ????p->right=q->right;??
  • ????q->right->left=p;??
  • ????p->left=q;??
  • ????q->right=p;??
  • }??
  • int?main()??
  • {??
  • ????int?ncase,n,m,i;??
  • ????char?cmd;??
  • ????int?x,y;??
  • ????scanf("%d",&ncase);??
  • ????while(ncase--)??
  • ????{??
  • ????????scanf("%d%d",&n,&m);??
  • ????????build(n);??
  • ????????while(m--)??
  • ????????{??
  • ????????????scanf("%*c%c%d%d",&cmd,&x,&y);??
  • ????????????switch(cmd)??
  • ????????????{??
  • ????????????case?'A':??
  • ????????????????A(x,y);break;??
  • ????????????case?'B':??
  • ????????????????B(x,y);break;??
  • ????????????case?'Q':??
  • ????????????????printf("%d\n",x?node[y].right->order:node[y].left->order);break;??
  • ????????????}??
  • ????????}??
  • ????}??
  • ????return?0;??
  • }??
  • 其實此題還可以不用鏈表,對比了一下,時間相差不大,相比而言非鏈表法更不容易出錯。

    思路基本一樣,直接給出代碼:

    [cpp] view plaincopyprint?
  • ???
  • #include<cstdio> ??
  • const?int?N=10005;??
  • struct?xyz??
  • {??
  • ????int?prv,nxt;??
  • }a[N];??
  • void?build(int?n)??
  • {??
  • ????int?i;??
  • ????for(i=1;i<=n;i++)??
  • ????????{??
  • ????????????a[i].prv=i-1;??
  • ????????????a[i].nxt=i+1;??
  • ????????}??
  • ????a[1].prv=n;??
  • ????a[n].nxt=1;??
  • }??
  • void?A(int?x,int?y)??
  • {??
  • ????a[a[x].prv].nxt=a[x].nxt;??
  • ????a[a[x].nxt].prv=a[x].prv;??
  • ????a[x].nxt=y;??
  • ????a[x].prv=a[y].prv;??
  • ????a[a[y].prv].nxt=x;??
  • ????a[y].prv=x;??
  • }??
  • void?B(int?x,int?y)??
  • {??
  • ????a[a[x].prv].nxt=a[x].nxt;??
  • ????a[a[x].nxt].prv=a[x].prv;??
  • ????a[x].nxt=a[y].nxt;??
  • ????a[x].prv=y;??
  • ????a[a[y].nxt].prv=x;??
  • ????a[y].nxt=x;??
  • }??
  • int?main()??
  • {??
  • ????int?ncase,n,m,i;??
  • ????char?cmd;??
  • ????int?x,y;??
  • ????scanf("%d",&ncase);??
  • ????while(ncase--)??
  • ????{??
  • ????????scanf("%d%d",&n,&m);??
  • ????????build(n);??
  • ????????while(m--)??
  • ????????{??
  • ????????????scanf("%*c%c%d%d",&cmd,&x,&y);??
  • ????????????switch(cmd)??
  • ????????????{??
  • ????????????case?'A':??
  • ????????????????A(x,y);break;??
  • ????????????case?'B':??
  • ????????????????B(x,y);break;??
  • ????????????case?'Q':??
  • ????????????????printf("%d\n",x?a[y].nxt:a[y].prv);break;??
  • ????????????}??
  • ????????}??
  • ????}??
  • ????return?0;??
  • }??
  • ??????????
  • 作者:chao1983210400 發(fā)表于2013-7-23 23:52:07 原文鏈接 閱讀:12 評論:0 查看評論

    轉載于:https://www.cnblogs.com/java20130808/p/3241306.html

    總結

    以上是生活随笔為你收集整理的[转]NYOJ-511-移动小球的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。