配對演算法實現與分析
這個也是做連連看時所寫的演算法,為了保持通用原則,這裡一律採用陣列實現
基本思路: 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 進行交換,生成下乙個排列,直到所有排列生成完畢為止,這樣,當前排列與其後繼排列只是兩個相鄰位置的元素發生了調換。當然,為了防止重複生成某...