posts - 403, comments - 310, trackbacks - 0, articles - 7
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          這個(gè)lab主要考察gdb的使用和對(duì)匯編代碼的理解。后者在平時(shí)的作業(yè)中涉及得較多,這里不再贅述,主要介紹一下gdb
          其實(shí)偶對(duì)這個(gè)也不是很熟,有錯(cuò)誤請(qǐng)指正 @@

          簡(jiǎn)單的說(shuō),gdb是一款強(qiáng)大的調(diào)試工具,盡管它只有文本界面(需要圖形界面可以使用ddd,不過(guò)區(qū)別不大),但是功能卻比eclipse等調(diào)試環(huán)境強(qiáng)很多。

          接下來(lái)看看怎樣讓它為lab2拆炸彈服務(wù),在命令行下運(yùn)行gdb bomb就能開(kāi)始調(diào)試這個(gè)炸彈程序,提高警惕,恩

          首先最重要的,就是如何阻止炸彈的引爆,gdb自然提供了一般調(diào)試工具都包括的斷點(diǎn)功能——break命令

          gdb中輸入help break能夠看到相關(guān)的信息

          (gdb) help break

          Set breakpoint at specified line or function.
          Argument may be line number, function name, or "*" and an address.
          If line number is specified, break at start of code for that line.
          If function is specified, break at start of code for that function.
          If an address is specified, break at that exact address.
          With no arg, uses current execution address of selected stack frame.
          This is useful for breaking on return to a stack frame.
          Multiple breakpoints at one place are permitted, and useful if conditional.
          Do "help breakpoints" for info on other commands dealing with breakpoints.

          可以看到break允許我們使用行號(hào)、函數(shù)名或地址設(shè)置斷點(diǎn)

          ctrl+z暫時(shí)掛起當(dāng)前的gdb進(jìn)程,運(yùn)行objdump –d bomb | more 查看反編譯后的炸彈文件,可以看到里面有這么一行(開(kāi)始的那個(gè)地址每個(gè)人都不同):

          08049719 <explode_bomb>:

          這個(gè)就是萬(wàn)惡的引爆炸彈的函數(shù)了,運(yùn)行fg返回gdb環(huán)境,在這個(gè)函數(shù)設(shè)置斷點(diǎn):

          break explode_bomb (可以使用tab鍵自動(dòng)補(bǔ)齊)

          顯示

          Breakpoint 1 at 0x8049707

          接下來(lái)你可以喘口氣,一般情況下炸彈是不會(huì)引爆的了

          下面我們來(lái)拆第一個(gè)炸彈,首先同樣是設(shè)置斷點(diǎn),bomb.c中給出了各個(gè)關(guān)卡的函數(shù)名,第一關(guān)就是phase_1,使用break phase_1在第一關(guān)設(shè)置斷點(diǎn)

          接下來(lái)就開(kāi)始運(yùn)行吧,輸入run

          Welcome to my fiendish little bomb. You hava 6 phases with

          which to blow yourself up. Hava a nice day!

          我們已經(jīng)設(shè)置了炸彈斷點(diǎn),這些恐嚇可以直接無(wú)視。

          輸入ABC繼續(xù)(輸入這個(gè)是為了方便在后面的測(cè)試中找到自己的輸入串地址)

          提示Breakpoint 2, 0x08048c2e in phase_1 (),說(shuō)明現(xiàn)在程序已經(jīng)停在第一個(gè)關(guān)了

          接下來(lái)就是分析匯編代碼,使用disassemble phase_1顯示這個(gè)函數(shù)的匯編代碼

          注意其中關(guān)鍵的幾行:

          8048c2e:68 b4 99 04 08          push   $0x80499b4

          8048c33:ff 75 08              pushl 0x8(%ebp)

          8048c36:e8 b1 03 00 00        call   8048fec <strings_not_equal>

          這個(gè)lab很厚道的一點(diǎn)就是函數(shù)名很明確地說(shuō)明了函數(shù)的功能 ^_^

          估計(jì)這三行代碼的意思就是比較兩個(gè)字符串相等,不相等的話(huà)應(yīng)該就會(huì)讓炸彈爆炸了

          因?yàn)樽址艽?,所以傳遞給這個(gè)比較函數(shù)的肯定是他們的地址,分別為0x80499b40x8(%ebp)

          我們先來(lái)看后者,使用p/x *(int*)($ebp + 8)查看字符串所在的地址

          $1 = 0x804a720,繼續(xù)使用p/x *0x804a720查看內(nèi)存中這個(gè)地址的內(nèi)容

          $2 = 0x434241,連續(xù)的三個(gè)數(shù),是不是想起什么了?把這三個(gè)數(shù)分別轉(zhuǎn)換為十進(jìn)制,就是67 66 65,分別為CBAASCII碼,看來(lái)這里保存了我們輸入的串。

          接下來(lái)0x80499b4里肯定保存著過(guò)關(guān)的密碼

          p/x *0x80499b4,顯示$3 = 0x62726556,c中的字符串是以0結(jié)尾的,看來(lái)這個(gè)字符串還不止這個(gè)長(zhǎng)度,繼續(xù)使用

          p/x *0x80499b4@10查看這個(gè)地址及其后面36個(gè)字節(jié)的內(nèi)容,終于在第二行中出現(xiàn)了終結(jié)符”0x0”(不一定是四個(gè)字節(jié))

          $4 = {0x62726556, 0x7469736f, 0x656c2079, 0x20736461, 0x75206f74, 0x656c636e, 0x202c7261, 0x72616e69,

           0x75636974, 0x6574616c, 0x69687420, 0x2e73676e, 0x0, 0x21776f57, 0x756f5920, 0x20657627, 0x75666564,

           0x20646573, 0x20656874, 0x72636573}

          把開(kāi)頭到0x0的所有信息字節(jié)下來(lái),通過(guò)手算或者自己寫(xiě)程序得出最后的密碼串(注意little endian中字符的排列方式?。?/span>

          輸入run重新運(yùn)行,輸入剛才得出的密碼串,如果前面的計(jì)算正確的話(huà),就會(huì)提示

          Phase 1 defused. How about the next one?

          關(guān)于這個(gè)lab的一些其他心得:

          1.       VMware中開(kāi)發(fā)很不舒服,屏幕小、字體丑@@、需要Ctrl+Alt切換回windows,不怎么方便,推薦在windows下使用pietty登錄虛擬機(jī)中的linux系統(tǒng)(RedHat 9默認(rèn)安裝了sshd),個(gè)人覺(jué)得這樣比較方便。

          2.       ASCII查詢(xún)可以在linux終端中運(yùn)行man ascii

          3.       退出gdb后,再次進(jìn)入時(shí)一定要注意使用breakexplode_bomb上斷點(diǎn),不可大意 ~.~

          4.       后面的幾關(guān)涉及遞歸等內(nèi)容,也有和前面幾次作業(yè)很相似的東東。

          5.    gdb中還有一個(gè)很好用的jump指令,可以在運(yùn)行時(shí)任意跳轉(zhuǎn)。
          6.    看匯編代碼時(shí),使用objdump -d bomb > bomb.asm把匯編代碼保存到bomb.asm中,然后使用sftp工具把這個(gè)文件下載到windows或者直接在vim中查看,這樣比在gdb中看方便一些。
          7.    個(gè)人認(rèn)為lab2和期中考試不沖突,這個(gè)lab2可以幫你理清很多匯編語(yǔ)言的概念

          其他補(bǔ)充:
          sfox: 
          可以通過(guò)GDB中的x /s addr輸出以\0結(jié)尾的字符串
          ICSLab: 
          為了防止每次拆的時(shí)候都不停的輸入之前的stage的key,可以把key存入文本文件,一行一個(gè)key,不要有多余字符
          然后GDB run 的時(shí)候用gdb bomb 回車(chē)
          (gdb) b .... ....
          (gdb) r password.txt
          這樣bomb就會(huì)自動(dòng)從password.txt中讀入之前的密碼
          直到到達(dá)最后一個(gè)空行處,如Lab2的說(shuō)明文檔中所述。

          posted @ 2007-11-20 00:37 ZelluX 閱讀(1151) | 評(píng)論 (0)編輯 收藏

          http://www.wiki.cn/wiki/Exponentiation_by_squaring

          Exponentiating by squaring is an algorithm used for the fast computation of large integer powers of a number. It is also known as the square-and-multiply algorithm or binary exponentiation. In additive groups the appropriate name is double-and-add algorithm. It implicitly uses the binary expansion of the exponent. It is of quite general use, for example in modular arithmetic.

          posted @ 2007-11-18 00:56 ZelluX 閱讀(403) | 評(píng)論 (0)編輯 收藏

          1. 純虛函數(shù)的聲明:將函數(shù)賦值為0
          virtual void gen_elems(int pos) = 0;

          2. 通常情況下,定義了一個(gè)或多個(gè)虛函數(shù)的基類(lèi)要定義一個(gè)虛析構(gòu)函數(shù),因?yàn)樵卺尫抛宇?lèi)內(nèi)存時(shí)具體析構(gòu)函數(shù)需要在運(yùn)行期才能確定。
          作者也不建議把析構(gòu)函數(shù)定義為純虛的,即使沒(méi)有任何具體的實(shí)現(xiàn)。

          恩,睡覺(jué)

          posted @ 2007-11-15 00:44 ZelluX 閱讀(466) | 評(píng)論 (4)編輯 收藏

          O(1)空間求矩陣轉(zhuǎn)置的算法,貌似是分解成幾個(gè)循環(huán)群,分別處理。
          from wikipedia

          http://www.aygfsteel.com/Files/zellux/In-place_matrix_transposition.zip

          posted @ 2007-11-12 16:16 ZelluX 閱讀(557) | 評(píng)論 (0)編輯 收藏

          Pitfall 1:判斷x的奇偶性
          public static boolean isOdd(int x) {
              
          return x % 2 == 1;
          }
          當(dāng)x為負(fù)奇數(shù)時(shí),x % 2的值為負(fù)數(shù)。
          Note:把 x % 2 == 1 改為 x % 2 != 0

          Pitfall 2:長(zhǎng)整數(shù)計(jì)算
          long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
          這個(gè)表達(dá)式先計(jì)算左邊幾個(gè)int的乘積,然后再把值轉(zhuǎn)換為long,因此仍會(huì)溢出
          Note:把24改成24L

          Pitfall 3:看看這句話(huà)的結(jié)果
          System.out.println(12345+5432l);
          Note:5432后面的l很容易被看成1,因此建議使用L表示長(zhǎng)整形時(shí)都使用大寫(xiě)。

          Pitfall 4:下面這句話(huà)又會(huì)是什么結(jié)果
          System.out.println(Long.toHexString(0x100000000L + 0xcafebabe));
          Java計(jì)算時(shí)先用sign-extension把后面一個(gè)數(shù)轉(zhuǎn)成long,然后再計(jì)算
          Note:盡量避免混合類(lèi)型計(jì)算

          Pitfall 5:這句話(huà)呢?
          System.out.println((int) (char) (byte) -1);
          結(jié)果是65535
          Note:char是無(wú)符號(hào)類(lèi)型,將char轉(zhuǎn)為int時(shí)使用zero-extension

          Pitfall 6:交換變量值
          int x = 1984;
          int y = 2001;
          x ^= y ^= x ^= y;
          最終結(jié)果是x == 0, y == 1984
          Note:Java中操作符是從左往右計(jì)算的 (JLS 15.7)
          改成 y = (x ^ (y ^= x) ^ y; 就可以,但是永遠(yuǎn)不要這么做 
           
          Pitfall 7:?jiǎn)柼?hào)操作符
          char x = 'X';
          int i = 0;
          System.out.print(true ? x : 0);
          System.out.print(false ? i : x);
          輸出結(jié)果為X88
          Note:同樣是混合類(lèi)型計(jì)算導(dǎo)致的問(wèn)題,建議在條件表達(dá)式中使用類(lèi)型相同的第二和第三操作符。
           
          Pitfall 8:看似相同的表達(dá)式的不同結(jié)果
          short x = 0;
          int i = 123456;
          1) x += i; // 隱含了類(lèi)型轉(zhuǎn)換,結(jié)果為-7616
          2) x = x + i; // 編譯無(wú)法通過(guò),因?yàn)閾p失了精度 
           

          posted @ 2007-11-10 21:32 ZelluX 閱讀(791) | 評(píng)論 (0)編輯 收藏

          第一次接觸后綴樹(shù)應(yīng)該是在某次省隊(duì)集訓(xùn),徐串大牛做的講座。
          不過(guò)當(dāng)時(shí)只是有了個(gè)印象。
          現(xiàn)在發(fā)現(xiàn)這東東還是很好用的  @,@

          http://www.aygfsteel.com/Files/zellux/SuffixT1withFigs.rar

          On–line construction of suffix trees
          by Esko Ukkonen

          Key Words.
          Linear time algorithm, suffix tree, suffix trie, suffix automaton, DAWG.

          Abstract.
          An on–line algorithm is presented for constructing the suffix tree for a given string in time linear in the length of the string. The new algorithm has the desirable property of processing the string symbol by symbol from left to right. It has always the suffix tree for the scanned part of the string ready. The method is developed as a linear–time version of a very simple algorithm for (quadratic size) suffix tries. Regardless of its quadratic worst-case this latter algorithm can be a good practical method when the string is not too long. Another variation of this method is shown to give in a natural way the well–known algorithms for constructing suffix automata (DAWGs).

          posted @ 2007-11-07 21:08 ZelluX 閱讀(1871) | 評(píng)論 (1)編輯 收藏

          發(fā)現(xiàn)居然還是Pascal描述,親切啊親切

          http://iprai.hust.edu.cn/icl2002/algorithm/datastructure/basic/binary_tree/chapter5_4.htm

          線(xiàn)索二叉樹(shù)

          當(dāng)用二叉鏈表作為二叉樹(shù)的存儲(chǔ)結(jié)構(gòu)時(shí),因?yàn)槊總€(gè)結(jié)點(diǎn)中只有指向其左、右兒子結(jié)點(diǎn)的指針,所以從任一結(jié)點(diǎn)出發(fā)只能直接找到該結(jié)點(diǎn)的左、右兒子。在一般情況下靠它無(wú)法直接找到該結(jié)點(diǎn)在某種遍歷序下的前驅(qū)和后繼結(jié)點(diǎn)。如果在每個(gè)結(jié)點(diǎn)中增加指向其前驅(qū)和后繼結(jié)點(diǎn)的指針,將降低存儲(chǔ)空間的效率。

          我們可以證明:在n個(gè)結(jié)點(diǎn)的二叉鏈表中含有n+1個(gè)空指針。因?yàn)楹琻個(gè)結(jié)點(diǎn)的二叉鏈表中含有個(gè)指針,除了根結(jié)點(diǎn),每個(gè)結(jié)點(diǎn)都有一個(gè)從父結(jié)點(diǎn)指向該結(jié)點(diǎn)的指針,因此一共使用了n-1個(gè)指針,所以在n個(gè)結(jié)點(diǎn)的二叉鏈表中含有n+1個(gè)空指針。

          因此可以利用這些空指針,存放指向結(jié)點(diǎn)在某種遍歷次序下的前驅(qū)和后繼結(jié)點(diǎn)的指針。這種附加的指針?lè)Q為線(xiàn)索,加上了線(xiàn)索的二叉鏈表稱(chēng)為線(xiàn)索鏈表,相應(yīng)的二叉樹(shù)稱(chēng)為線(xiàn)索二叉樹(shù)。為了區(qū)分一個(gè)結(jié)點(diǎn)的指針是指向其兒子的指針,還是指向其前驅(qū)或后繼結(jié)點(diǎn)的線(xiàn)索,可在每個(gè)結(jié)點(diǎn)中增加兩個(gè)線(xiàn)索標(biāo)志。這樣,線(xiàn)索二叉樹(shù)結(jié)點(diǎn)類(lèi)型定義為:

          type

           TPosition=^thrNodeType;

           thrNodeType=record

                        Label:LabelType;

                        ltag,rtag:0..1;

                        LeftChild,RightChild:TPosition;

                       end;

          其中l(wèi)tag為左線(xiàn)索標(biāo)志,rtag為右線(xiàn)索標(biāo)志。它們的含義是:

          • ltag=0,LeftChild是指向結(jié)點(diǎn)左兒子的指針;
          • ltag=1,LeftChild是指向結(jié)點(diǎn)前驅(qū)的左線(xiàn)索。
          • rtag=0,RightChild是指向結(jié)點(diǎn)右兒子的指針;
          • rtag=1,RihgtChild是指向結(jié)點(diǎn)后繼的右線(xiàn)索。

          例如圖13(a)是一棵中序線(xiàn)索二叉樹(shù),它的線(xiàn)索鏈表如圖13(b)所示。

          (a)

          (b)

          圖13 線(xiàn)索二叉樹(shù)及其線(xiàn)索鏈表

          圖13(b)中,在二叉樹(shù)的線(xiàn)索鏈表上增加了一個(gè)頭結(jié)點(diǎn),其LeftChild指針指向二叉樹(shù)的根結(jié)點(diǎn),其RightChild指針指向中序遍歷時(shí)的最后一個(gè)結(jié)點(diǎn)。另外,二叉樹(shù)中依中序列表的第一個(gè)結(jié)點(diǎn)的LeftChild指針,和最后一個(gè)結(jié)點(diǎn)的RightChild指針都指向頭結(jié)點(diǎn)。這就像為二叉樹(shù)建立了一個(gè)雙向線(xiàn)索鏈表,既可從第一個(gè)結(jié)點(diǎn)起,順著后繼進(jìn)行遍歷,也可從最后一個(gè)結(jié)點(diǎn)起順著前驅(qū)進(jìn)行遍歷。

          如何在線(xiàn)索二叉樹(shù)中找結(jié)點(diǎn)的前驅(qū)和后繼結(jié)點(diǎn)?以圖13的中序線(xiàn)索二叉樹(shù)為例。樹(shù)中所有葉結(jié)點(diǎn)的右鏈?zhǔn)蔷€(xiàn)索,因此葉結(jié)點(diǎn)的RightChild指向該結(jié)點(diǎn)的后繼結(jié)點(diǎn),如圖13中結(jié)點(diǎn)"b"的后繼為結(jié)點(diǎn)"*"。當(dāng)一個(gè)內(nèi)部結(jié)點(diǎn)右線(xiàn)索標(biāo)志為0時(shí),其RightChild指針指向其右兒子,因此無(wú)法由RightChild得到其后繼結(jié)點(diǎn)。然而,由中序遍歷的定義可知,該結(jié)點(diǎn)的后繼應(yīng)是遍歷其右子樹(shù)時(shí)訪問(wèn)的第一個(gè)結(jié)點(diǎn),即右子樹(shù)中最左下的結(jié)點(diǎn)。例如在找結(jié)點(diǎn)"*"的后繼時(shí),首先沿右指針找到其右子樹(shù)的根結(jié)點(diǎn)"-",然后沿其LeftChild指針往下直至其左線(xiàn)索標(biāo)志為1的結(jié)點(diǎn),即為其后繼結(jié)點(diǎn)(在圖中是結(jié)點(diǎn)"c")。類(lèi)似地,在中序線(xiàn)索樹(shù)中找結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)的規(guī)律是:若該結(jié)點(diǎn)的左線(xiàn)索標(biāo)志為1,則LeftChild為線(xiàn)索,直接指向其前驅(qū)結(jié)點(diǎn),否則遍歷左子樹(shù)時(shí)最后訪問(wèn)的那個(gè)結(jié)點(diǎn),即左子樹(shù)中最右下的結(jié)點(diǎn)為其前驅(qū)結(jié)點(diǎn)。由此可知,若線(xiàn)索二叉樹(shù)的高度為h,則在最壞情況下,可在O(h)時(shí)間內(nèi)找到一個(gè)結(jié)點(diǎn)的前驅(qū)或后繼結(jié)點(diǎn)。在對(duì)中序線(xiàn)索二叉樹(shù)進(jìn)行遍歷時(shí),無(wú)須像非線(xiàn)索樹(shù)的遍歷那樣,利用遞歸引入棧來(lái)保存待訪問(wèn)的子樹(shù)信息。

          對(duì)一棵非線(xiàn)索二叉樹(shù)以某種次序遍歷使其變?yōu)橐豢镁€(xiàn)索二叉樹(shù)的過(guò)程稱(chēng)為二叉樹(shù)的線(xiàn)索化。由于線(xiàn)索化的實(shí)質(zhì)是將二叉鏈表中的空指針改為指向結(jié)點(diǎn)前驅(qū)或后繼的線(xiàn)索,而一個(gè)結(jié)點(diǎn)的前驅(qū)或后繼結(jié)點(diǎn)的信息只有在遍歷時(shí)才能得到,因此線(xiàn)索化的過(guò)程即為在遍歷過(guò)程中修改空指針的過(guò)程。為了記下遍歷過(guò)程中訪問(wèn)結(jié)點(diǎn)的先后次序,可附設(shè)一個(gè)指針pre始終指向剛剛訪問(wèn)過(guò)的結(jié)點(diǎn)。當(dāng)指針p指向當(dāng)前訪問(wèn)的結(jié)點(diǎn)時(shí),pre指向它的前驅(qū)。由此也可推知pre所指結(jié)點(diǎn)的后繼為p所指的當(dāng)前結(jié)點(diǎn)。這樣就可在遍歷過(guò)程中將二叉樹(shù)線(xiàn)索化。對(duì)于找前驅(qū)和后繼結(jié)點(diǎn)這二種運(yùn)算而言,線(xiàn)索樹(shù)優(yōu)于非線(xiàn)索樹(shù)。但線(xiàn)索樹(shù)也有其缺點(diǎn)。在進(jìn)行插人和刪除操作時(shí),線(xiàn)索樹(shù)比非線(xiàn)索樹(shù)的時(shí)間開(kāi)銷(xiāo)大。原因在于在線(xiàn)索樹(shù)中進(jìn)行插人和刪除時(shí),除了修改相應(yīng)的指針外,還要修改相應(yīng)的線(xiàn)索。

          posted @ 2007-11-07 11:02 ZelluX 閱讀(874) | 評(píng)論 (0)編輯 收藏

          要做個(gè)和Java3D有關(guān)的項(xiàng)目,需要稍微了解下相關(guān)的知識(shí)。
          看的資料是The Java3d Tutorial,版本有點(diǎn)早,湊合著看了。 
              
          Java 3D 的虛擬環(huán)境是從場(chǎng)景圖(scene graph)中建立的,場(chǎng)景圖聚合(assemble)了各種定義幾何、聲音、光、位置、方位等元素的類(lèi)。 

          一種常用的定義圖的數(shù)據(jù)結(jié)構(gòu)由結(jié)點(diǎn)(node)和弧(arc)組成。結(jié)點(diǎn)都是Java 3D類(lèi)的實(shí)例,而弧則代表了實(shí)例間兩種不同的關(guān)系。
          最常見(jiàn)的關(guān)系是父子(parent-child)關(guān)系。一個(gè)組結(jié)點(diǎn)(group node)可以包含任意多的子結(jié)點(diǎn),但只能有一個(gè)父結(jié)點(diǎn)。
          另一種關(guān)系是引用(reference),引用通過(guò)一個(gè)場(chǎng)景圖的結(jié)點(diǎn)關(guān)聯(lián)了一個(gè)NodeComponent類(lèi),NodeComponent類(lèi)定義了各種視圖對(duì)象的幾何和外觀屬性。
          這種結(jié)構(gòu)可以用樹(shù)來(lái)描述,從根結(jié)點(diǎn)到任一葉子結(jié)點(diǎn)的路成為場(chǎng)景圖路徑(scene graph path). 每條路徑都完整地描述了它的葉子結(jié)點(diǎn)的狀態(tài)。 
           

          這就是一個(gè)簡(jiǎn)單的場(chǎng)景圖的結(jié)構(gòu),其中包括VisualUniverse  Locale  GroupNode  Leaf 等元素 

          每個(gè)場(chǎng)景圖都有單一的VirtualUniverse,后者包含一串Locale對(duì)象。一個(gè)程序可以包含多個(gè)VirtualUniverse對(duì)象,但是沒(méi)有一種簡(jiǎn)單的方法實(shí)現(xiàn)它們相互之間的通信。 
           
          寫(xiě)Java3D程序的通常步驟:
           1. 創(chuàng)建一個(gè)Canvas3D對(duì)象
           2. 創(chuàng)建一個(gè)VirtualUniverse對(duì)象
           3. 創(chuàng)建一個(gè)Locale對(duì)象,將其與VirtualUniverse相關(guān)聯(lián)
           4. 構(gòu)造視圖分支(view branch graph):分別創(chuàng)建一個(gè)View ViewPlatform PhysicalBody PhysicalEnvironment對(duì)象,將后面三個(gè)及Canvas3D與View對(duì)象關(guān)聯(lián)
           5. 構(gòu)造內(nèi)容分支(content branch graph)
           6. 編譯(compile)各個(gè)分支
           7. 將子圖(subgraph)插入Locale中 
           
          使用SimpleUniverse可以簡(jiǎn)化這些步驟 
           

          虛線(xiàn)框起來(lái)的部分就是SimpleUniverse中提供的內(nèi)容 
           
          通過(guò)它可以將步驟簡(jiǎn)化為
           1. 創(chuàng)建一個(gè)Canvas3D對(duì)象
           2. 創(chuàng)建一個(gè)引用了之前的Canvas3D對(duì)象的SimpleUniverse類(lèi),并定制該類(lèi)
           3. 構(gòu)造一個(gè)內(nèi)容分支,編譯后插入SimpleUniverse的Locale
           
          什么是編譯(compile):通過(guò)編譯BranchGroup,可以將它及其祖先轉(zhuǎn)換為一種更高效的實(shí)現(xiàn)方式。建議在最后一步中做編譯。

          posted @ 2007-11-05 21:43 ZelluX 閱讀(2415) | 評(píng)論 (1)編輯 收藏

               摘要: 問(wèn)題:
          有兩堆石子,數(shù)量任意,可以不同。游戲開(kāi)始由兩個(gè)人輪流取石子。游戲規(guī)定,每次有兩種不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在兩堆中同時(shí)取走相同數(shù)量的石子。最后把石子全部取完者為勝者。現(xiàn)在給出初始的兩堆石子的數(shù)目,如果輪到你先取,假設(shè)雙方都采取最好的策略,問(wèn)最后你是勝者還是敗者。  閱讀全文

          posted @ 2007-10-31 18:11 ZelluX 閱讀(1758) | 評(píng)論 (2)編輯 收藏

          算法課的習(xí)題
          題目很簡(jiǎn)單,但是代碼很漂亮

          [zz]

          template <typename T>
          class min_stack {
          public:
            
          void push(const T& v) {
              s.push(make_pair(v, empty()
          ||v<s.top().second ? v : s.top().second));
            }


            
          void pop() { s.pop(); }

            
          const T& top() return s.top().first; }

            
          const T& min() return s.top().second; }

            
          bool empty() return s.empty(); }

          private:
            std::stack
          <std::pair<T, T> > s;
          }
          ;

          posted @ 2007-10-29 21:30 ZelluX 閱讀(766) | 評(píng)論 (2)編輯 收藏

          僅列出標(biāo)題
          共39頁(yè): First 上一頁(yè) 10 11 12 13 14 15 16 17 18 下一頁(yè) Last 
          主站蜘蛛池模板: 金坛市| 松溪县| 宜章县| 郴州市| 丰原市| 博野县| 宁安市| 佛冈县| 五指山市| 宁化县| 高淳县| 台南县| 阳山县| 红桥区| 精河县| 宁陵县| 潞城市| 霍州市| 眉山市| 合肥市| 武隆县| 桐城市| 华蓥市| 安平县| 肥东县| 淮阳县| 隆安县| 伊通| 新疆| 麦盖提县| 三门县| 怀宁县| 广水市| 邹城市| 洪江市| 内黄县| 依安县| 铁岭市| 普洱| 旬阳县| 巨野县|