配對序列生成演算法實現與分析

2021-08-24 19:12:49 字數 3740 閱讀 1801

配對演算法實現與分析

這個也是做連連看時所寫的演算法,為了保持通用原則,這裡一律採用陣列實現

基本思路: 1.

先將所有元素填充到陣列裡,並把出現次數放到

ecount裡、最後出現的位址放到

lastaddr中。

2.檢視ecount

此時陣列裡的各種元素出現的次數有雙有單。 3.

找出兩個ecount[x1],ecount[x2]

為單的元素的

lastaddr[x1]、lastaddr[x2]

,並設定data[

lastaddr[x1]]=data[lastaddr[x2]]。

4.這就完成了雙去單。

/** * 產生範圍在[start,end]區間的配對的序列,填充到int

[arrayrows>0][arraycloums>0]的陣列中,

* 最後返回這個陣列

* 完美版,適用於任何情況

* *@paramstart

*            起始整數

*@paramend

*            終點整數

*@paramarrayrows

*            陣列行數

*@paramarraycolums

*            陣列列數

*@return如果引數中陣列行列值小於等於零或者陣列大小為奇數,則返回null,否則

*         返回已經填充了配對數的陣列int

[arrayrows][arraycloums]

*/publicstaticintpartnerup(intstart,intend,intarrayrows,

intarraycolums)

intecount;

// 元素計數器

intlastaddr;

// 元素最後出現的位址

intdata =newint[arrayrows][arraycolums];

// 儲存配對序列陣列

intarraysize = arrayrows * arraycolums;

// 陣列大小

intmaxpartners = arraysize / 2;

// 陣列中可能出現的最大對數

// 將start恆置為小的數,end為大的數

if(end - start < 0)

// 填充範圍,大於0

intfillarea = math.abs(end - start) + 1;

// 填充範圍是否大於最大配對數,如果是的,則只需maxpartens個填充因子就可以了

booleanisoverpartner=(fillarea - maxpartners)>0?true:false;

intfillelemts=newint[0];

if(isoverpartner)

//陣列位址範圍,計數器、最後位址陣列位址範圍

fillarea=maxpartners;

ecount =newint[fillarea];

lastaddr =newint[fillarea];

}else

// 填充data

for(inti = 0; i < arraysize; i++)else

// 將最後出現的位址賦給addrcount[index]儲存

lastaddr[index - start] = i; }

// 圖素配對開始(去單操作)

// 從計數陣列的最有乙個元素開始

inti = ecount.

length

- 1;

// 出現的元素中數量為奇數的元素個數

intpcount = 0;

while(i > -1) }

// 如果確實存在奇數個元素

while(pcount > 0)

} }} }

// 圖素配對結束

returndata; }

測試結果:

xx代表方括號裡的的數字

llktookit.partnerup(x,x,4,4)

**********=[1,15]

8,14,15,14,

10,8,2,1,

15,2,1,10,

14,8,14,8,

**********====[-1

,15]

-1,12,6,12,

3,6,6,6,

13,-1,6,15,

15,13,6,3,

**********====[-1,-15]

-6,-5,-6,-6,

-9,-6,-6,-1,

-7,-9,-5,-7,

-15,-1,-6,-15,

**********===[0,0]

0,0,0,0,

0,0,0,0,

0,0,0,0,

0,0,0,0,

**********===[1,1]

1,1,1,1,

1,1,1,1,

1,1,1,1,

1,1,1,1,

**********====[-1,-1]

-1,-1,-1,-1,

-1,-1,-1,-1,

-1,-1,-1,-1,

-1,-1,-1,-1,

分析:從**上看,寫得比較繁雜,從執行結果來看,該函式實現的還不錯。

總結:這個方法的實現經歷最初的內嵌版本,再是分離出來後的不完美版(

有興趣的可以看看,在下面)

,知道今天改的自認為完美版,一路走來都意味著一次次的進步,和對完美的追求,今天寫的這個配對演算法和之前寫的連線演算法一起,作為我暑假連連看遊戲製作的最終收穫,我覺得,雖然不豐厚,但至少很值得。

不完美版**,在注釋中有「為什麼不完美的解釋」

以下是word文件

隨機迷宮生成演算法整理分析

蒐集整理了一些遊戲迷宮生成的演算法與實現 前段時間學校遊戲開發課大作業,做了乙個roguelike的恐怖遊戲。蒐集整理了一些迷宮生成的演算法。當初也受了indienova上一些文章的啟發。現在在此把學到的一些東西理一理分享出來。第一次寫這種東西,感覺有點囉嗦,還請大家不要介意,也可以直接看專案位址 ...

格雷碼生成演算法分析及實現(C OC)

gray code是乙個數列集合,每個數使用二進位來表示,假設使用n位元來表示每個數好了,任兩個數之間只有乙個位元值不同,例如以下為3位元的gray code 000001 011 010 110 111 101 100 由定義可以知道,graycode的順序並不是唯一的,例如將上面的數列反過來寫,...

全排列生成演算法java實現

steinhaus johnson trotter演算法是一種基於最小變換的全排列生成演算法,對於排列a 1.n 該演算法通過將a i 與a i 1 或a i 1 進行交換,生成下乙個排列,直到所有排列生成完畢為止,這樣,當前排列與其後繼排列只是兩個相鄰位置的元素發生了調換。當然,為了防止重複生成某...