日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[转]NYOJ-511-移动小球

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

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

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

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

[cpp] view plaincopyprint?
  • struct?Node??
  • {??
  • ????int?order;??
  • ????Node?*left,*right;??
  • }node[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左邊)的實現方法:
  • 1.將x左邊節點的right指針指向x的右邊節點

    2.將x右邊節點的left指針指向x的左邊節點

    3.將x的right指向y節點

    4.將x的left指向y左邊的節點

    5.將y左邊節點的right指向x節點

    6.將y的left指向x節點

    實現代碼:

    [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;??
  • }???由于交換位置僅改變節點的左右指針,并沒有改變數組的下標(下標其實與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 發表于2013-7-23 23:52:07 原文鏈接 閱讀:12 評論:0 查看評論

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

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。