NYOJ 511 移動小球

2021-06-16 23:53:04 字數 1707 閱讀 2576

這道題很容易想到要構建乙個迴圈鍊錶來確定每個球的相對位置,就是操作比較繁瑣,考慮情況較多。

首先要建立節點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小球移動到編號為...