移動盒子 雙向鍊錶

2021-08-30 09:06:39 字數 1834 閱讀 6492

移動盒子uva 12657

你有一行盒子,從左到右依次編號為1,2,3,…,n。可以執行以下4種指令:

1 x y:表示把盒子x移動到盒子y的左邊(如果x已經在y的左邊則忽略此指令)。

2 x y:表示把盒子x移動到盒子y的右邊(如果x已經在y的右邊則忽略此指令)。

3 x y:表示交換盒子x和y的位置。

4:表示反轉整條鏈。

指令保證合法,即x不等於y。

例如當n=6時在初始狀態盒子序列為為:1 2 3 4 5 6;

執行1 1 4後,盒子序列為:2 3 1 4 5 6;

接下來執行2 3 5,盒子序列變為:2 1 4 5 3 6;

再執行3 1 6,盒子序列變為:2 6 4 5 3 1;

最終執行4,盒子序列變為:1 3 5 4 6 2。

【輸入格式】

輸入包含不超過10組資料,每組資料第一行為盒子數n和指令m,以下m行每行包含一條指令。

【輸出格式】

每組資料輸出一行,即所有奇數字置的盒子編號之和。位置從左到右編號為1~n。

【輸入樣例】

6 41 1 4

2 3 5

3 1 6

46 3

1 1 4

2 3 5

3 1 6

100000 1

4【輸出樣例】129

沒有用c語言寫,太麻煩了。

這裡直接使用list容器進行模擬。(由於c++是自學的,容器也不咋會用,回頭補補知識)

**模擬:

//移動盒子——鍊錶實現

//dacao

//2018/10/29

#include#includeusing namespace std;

int main()

cin>>x>>y;

for(it=box.begin();it!=box.end();it++)

if(op==1)

if(op==2)

if(op==3)

} int sum=0;

it=box.begin();

for(i=1;i<=n;i++)

cout《當然,這樣寫的結果會超時,答案是用陣列來代替雙向鍊錶,且處理很有技巧uva12657 移動盒子

鏈結中,有一行**看不懂~

想不通:if(p == 3 && right[y] == x) swap(x, y);

**來自:

#include#include#includeusing namespace std;

#define maxl 100010

int right[maxl], left[maxl];

inline void link(int l, int r)

int main()

for(i = 1; i <= m; i++)

int lx = left[x], rx = right[x], ly = left[y], ry = right[y];

switch (p)

case 2 :

case 3 :

break;

}default : break;

}} long long ans = 0;

int b = 0;

for(i = 1; i <= n; i++)

if(sta && n % 2 == 0) ans = (long long)n * (n + 1) / 2 - ans;

printf("case %d: %lld\n", cases++, ans);

} return 0;

}

Uva 12657 移動盒子(雙向鍊錶)

你有一行盒子,從左到右依次編號為1,2,3,n。可以執行以下4種指令 1 x y表示把盒子x移動到盒子y左邊 如果x已經在y的左邊則忽略此指令 2 x y表示把盒子x移動到盒子y右邊 如果x已經在y的右邊則忽略此指令 3 x y表示交換盒子x和y的位置。4 表示反轉整條鏈。指令保證合法,即x不等於y...

Uva 12657 移動盒子(雙向鍊錶)

你有一行盒子,從左到右依次編號為1,2,3,n。可以執行以下4種指令 1 x y表示把盒子x移動到盒子y左邊 如果x已經在y的左邊則忽略此指令 2 x y表示把盒子x移動到盒子y右邊 如果x已經在y的右邊則忽略此指令 3 x y表示交換盒子x和y的位置。4 表示反轉整條鏈。從操作1,2來看,需要有乙...

mysql 雙向鍊錶 雙向鍊錶

雙向鍊錶是鍊錶變型,相比於單鏈表導航或者是向前和向後的兩種方式。以下是重要的術語來理解雙向鍊錶的概念 link 鍊錶的每個鏈路儲存資料稱為乙個元素。linkedlist linkedlist包含連線鏈結到名為首先第乙個鏈結,並稱為最後的最後乙個鏈結 last 雙向鍊錶表示 按照如上圖中所示,以下是要...