這道題很容易想到要構建乙個迴圈鍊錶來確定每個球的相對位置,就是操作比較繁瑣,考慮情況較多。
首先要建立節點node,每個節點都有乙個初始順序order,指向左邊的node*指標left,何指向右邊的node*指標right。
[cpp]view plain
copy
print?
struct node
node[n];
然後給每個小球附上順序,並建立和左右的聯絡。
[cpp]view plain
copy
print?
void build(int n)
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 plain
copy
print?
void a(int x,int y)
由於交換位置僅改變節點的左右指標,並沒有改變陣列的下標(下標其實與order相同),所以查詢球號時直接用下標索引。
同理可知操作b。
完整**如下:
[cpp]view plain
copy
print?
#include
const
int n=10005;
struct node
node[n];
void build(int n)
node[1].left=&node[n];
node[n].right=&node[1];
node[n].order=n;
} void a(int x,int y)
void b(int x,int y)
int main()
} } return 0;
}
其實此題還可以不用鍊錶,對比了一下,時間相差不大,相比而言非煉表法更不容易出錯。
思路基本一樣,直接給出**:
[cpp]view plain
copy
print?
#include
const
int n=10005;
struct xyz
a[n];
void build(int n)
a[1].prv=n;
a[n].nxt=1;
} void a(int x,int y)
void b(int x,int y)
int main()
} } return 0;
}
NYOJ 511 移動小球 模擬
解題思路 先預處理一下左右陣列,使他們滿足初始時候的左右鄰居。然後模擬移動即可。這裡需要注意的就是移動時改變左右鄰居時,要防止覆蓋問題。就是我更改某個鄰居後,不能在以後的修改中影響這個值,所以順序需要注意。在這裡錯了,找了半個小時。悲劇。如下 include include include incl...
nyoj 511 移動小球(鍊錶的簡單使用)
描述 給你n個小球,從左到右編號依次為1,2,3,4,5,6.n,並規定小球1的左邊的球號為n,小球n的右邊的球號為1.現在有以下3種操作 a x y表示把編號為x小球移動到編號為y的小球的左邊,b x y表示把編號為x小球移動到編號為y的小球的右邊,q 1 m為詢問編號為m的小球右邊的球號,q 0...
ny511 移動小球
時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述給你n個小球,從左到右編號依次為1,2,3,4,5,6.n,並規定小球1的左邊的球號為n,小球n的右邊的球號為1.現在有以下3種操作 a x y表示把編號為x小球移動到編號為y的小球的左邊,b x y表示把編號為x小球移動到編號為...