2012年10月25日 星期四

《我們為什麼要活著?》的書摘


(未完,待寫)

作者實在太有智慧,文筆太好,翻譯內容亦十分流暢,本來想寫一些讀後感,但不知道怎樣評論,我的智慧實在太小,還未看透,只能抄點書摘和用我的用字轉述一些我理解的書內容,那些人生的態度的智慧。

以下基本上是《我們為什麼要活著?尋找生命意義的11堂哲學必修課》的書摘要和我的讀後感。從人的起源、未來、成就、助人、整體人類福祉、及時行樂、為了快樂、超脫自我、沒有意義、非理性、愛等各方面去探討人生意義,人生每種目標對人的解答的意義。


人生目的不是天啟的,是由人定義的


人生的目的或價值不是來自外來的,世上宗教有很多種,各種宗教教條內容也互相不容,選擇信那個宗教還是依賴理性,另外,就算你相信宗教教條或神聖經文,有些東西可信還是要由你決定的,例如道德原則卻比宗教誡律更優先,如果宗教原則違背人的道德原則會令人厭惡,所以任何人的行為和決定有訴諸於理性的必要,原則是可以討論和有原由有證據去支持、去評估的,另外,假設有人自由的意志,人有自我選擇權、自我決定能力,即可有自由去遵守或不遵守,那個外來的目的與意義對人來說根本沒有什麼必然的聯繫,什麼重要不重要是人的決定,即人生意義由人定義。



將意義投射於未來問題


現在意義由未來定義,主要有兩個問題


如果現在意義只是由未來定義,不久的將來為了更久的未來,形成無限後退,永遠沒有盡頭,那麼人生意義目標永遠不能達到,自我推翻,不能實踐。


第二,忽視當下意義,例如:讀好書為了考好公開試,公開試好成績為了入大學,入大學為了找到較好的工作,較好的工作為了有更好的收入,更好的收入為了結婚,結婚為了生兒育女,生兒育女為了老有所依 .... 直接最後死亡為止,出生為了死亡嗎?,現在不完全為了將來的目標,當下社會每人工作就是為滿足他人的需要而做,難道垷在的所做的事就當下對你沒有意義?



將幸福投射於未來問題


人有太多虛假和不切實際的幻想,人腦的預測系統太差,認會幻想出來的未活生活會來的幸福遠遠超過現在的生活,沒有了解到當下就能給人滿足感,滿足感主觀的,想起Ted talk一段演講,內容大意也是這樣。 



[TED talk] 哈佛心理系教授Dan Gilbert: 我們為什麼會快樂?









人往往會高估對未來的幻想、渴望目標帶來的快樂,好處,低估現存滿足感、幸福感,其實理想並沒有人想像中帶來更多的快樂,當人達不到理想目標時候,人會自動調節期望,減低失落感,使人更易滿足於現況,快樂是主觀的,不是外在的,或來自社會的價值觀。野心太大會令人踏入危險,我們會說謊言、欺騙、偷竊、傷害他人犧牲掉真正價值的東西。



永生、死後有生命、輪迴的可疑地方


有將目標投射於未來的問題,另外,如果真有永生、死後有生命、輪迴,理性推想會出現什麼情況永生,一般人想像有兩種,一種是有死後有靈魂沒有物質身體存在,另一種是復活式有身體的永生,兩種情況都是非常奇怪。


我們有性別,有形體,能運言語言,會閱讀,傾聽並與他人互動,沒有形體的靈魂生命和我們已知的生命形態非常不同,為什麼靈魂可以作為延續我門非常有人性的生命的個體?


第二種是復活式有身體的永生,想像一下,有一種身體可以令你的生命永遠生存下去,這種身體與你所知道的身體是否有很大程度分別?,會老會受傷嗎?,會忘記一段記憶嗎?,再想人的自我意識,很大程度取決於性格和記憶,如果生命是短短的一百幾十年,人格變化連續度還可以視為有同一性,但永生的我可能忘記「現在的我」的所有記憶和性格,那麼人格還有


什麼連續性?那多段的人生與「現在的我」為什麼關係與「現在的我」的人生意義有什麼關係呢?賭死後有生命看來沒有什麼肯定的證據,但現在的生命有限和會死卻證據十足,為什麼要在可能性極低的永生找尋到意義,而不在現在可知道的人生找意義,信仰有超驗的死生生命去找尋人生意義有極大的風險。


輪迴問題:
沒身體連續性,前世和來生的身體有著極大的不同,前生可以是男,來生可以是女或其他生物,兩者可以沒有任何相似性,記憶、性格也一樣,記憶可能只是一小部份可疑記憶,性格也只是一部份相似,以記憶以什麼媒體延續來生的生命?,記憶由那時進入來生的生命,生命最初開始只有數個細胞,記憶是什麼時候進入來生的大腦?,地球另一邊也有人和你身體有相似,性格可能更相似,那人和你是同一人嗎?相似到什麼程度才是另一個人?究竟是什麼原因令人相信只是心理和性格有點相似就是同一人?


宗教的死後生命講法非常可疑,而且不能給「現在的我」的人生有什麼啟示。



助人為人生唯一目的問題


以助人為人生目的人,其實是將手段和目的混淆了,助人目的只為其他人過更好的生活,目的並非為了助人行為本身,對沒有需要幫助的人,幫助他是沒有需要的,助人行為是沒有意義的。


以幫助更大整體為目標 (促進人類整體福祉)


人類是一個抽象的概念,不能感受幫助,人個體才能感到幫助,沒有什麼整體人類求助,幫助只是個人主觀的意願,另外,什麼才是對人類整體有利,沒有客觀標準,登錄月球對一個普通人有什麼意義?,福址可量化嗎?,是那一方面,全人類的利益是否大於少數人的利益,如果有標準可能只是有權勢人的定義,犧牲小數成就更大的「善」,好的意願可能做成災難的後果。另一個問題,將個人意放大成為幫助更大整體,那是將個人意義放棄投射在更大的個體身上,更大的個體意義能取代個人意義嗎?,這是兩種不同的東西。



以追求成或就為鬥士為目標


如是成就是絕對,那麼只有少數人能獲得成功,如取得諾貝爾獎,如果成就是相對的,那麼成就就不是成就,因為任何人都能有自己成功標準。事實應該追求的是成功帶來的價值,而不是成功本身,沒有人能各方面都成功,應該訂下一種適合自己的目標,一種可持續有意義的工作,把成功定義詮譯得太狹窄,只會跌入盲名的排名遊戲和劇烈競爭中。


自我自助改善的危險和盲點 (看得過多心靈雞湯也是毒)


生命中並非所有理想都能達成,人有缺憾是非常正常的事,自助文化下茲生的掌控其實是幻覺,世上不能改變的事在太多,太多缺點是不能改變,很多事情的成功並非單靠自己鍛鍊就能達成,很多事的成功是由很多外在環境因素造成。過多的欲求、要求反而會成為焦慮和自我懷疑的源頭,妄想變成十全十美的人,完全掌握自己的健康,財富和快樂,變成更多不同類型的人,做更多的事,只會徒勞無功。我們可以從他人身上學習自助的建議,但也必定下自己能做的時間表,什麼是真正的需要,成功實際上有什麼價值。


無我 (失去自我的感覺)

一般說法就是解放心靈,放下,自戀,自我偏執,另一個意思是擺脫,感官來的感覺,超脫自己達到一種神秘的無我境界 (擺脫煩惱、痛苦、慾望、一切自我感覺,去達到平靜安寧宇宙合一的境界)

前者確實有些益處,減少達到滿足的障礙,但還不清楚對生命有什麼重要性,有什麼價值的啟發,後一種說法實際是一種自我滿足的行為,可能是一種自我逃避,但可以帶來一些滿足感,但對人生有什麼意義?暫時感覺到無我可能是一種錯覺,當恢復知覺,世界上的你沒有與宇宙合一,身體邊界仍在,要徹底無我,有一個簡單的說法就是「死」。其他一切不能用言語表達的無我感受,實際是無法討論、溝通和證辨的,簡單就是說是沒有意義,如喝下一首交響樂曲。

沒有意義
.............



看完《我們為什麼要活著?尋找生命意義的11堂哲學必修課》讀後感:保持樂觀很重要,因為會影響個人做人處事的態度,生活不能完全偏重某一方面的價值,不然失去時就會很失樂、痛苦,很絕望,有關心的人和事,有一些工作,保持人在社會中有點定位有作用,保持一點美好願景,人自然會有希望,有活下去動力。

2012年7月11日 星期三

個人收集分享 - 技術型網站連結

草稿 (未完) .......


新聞或技術網站、社群

  •  博客 - 伯樂在線 (簡體、大陸)
    - 外國譯文分享、原創技術文章,文章質素技術頗高
  •  iThome online : : 專欄 (繁體、台灣)
    隔一兩天就有新文章,更新很快,難度不太高,但有時都會看不懂、不明白作者用意或主旨是什麼,另外,這個 Blog 沒有RSS支援,要手動追看更新。
  •   Web App Trend  (簡體、大陸) 
    外國譯文分享、原創技術文章,專注網絡趨勢的網站
  
個人 Blog / 網站

  • 香港矽谷 IT Blogs 
    是一個針對【IT網絡創業】的交流平台,透過滙聚世界各地 Bloggers 的精選文章,加以整理及分類,為有意創業的人仕提供實時及有用的資訊。 (以上介紹來自Blogs本身,少看,個人喜愛技術型的網頁,例如:博客 - 伯樂在線 )
  •  酷殼 (簡體、大陸)
    大陸高手陳皓的 Blog,分享技術見聞,知識,趨勢的網站
  •  Coding Horror (外國,英文)
    賴得看外文,累,已停看,外國高手寫的Blog,經常有啟發性的文章發表) 

    例子:
    Top 25 Most Dangerous Programming Mistakes

  • Joel on Software (外國,英文,有各國語言翻譯版本)
    99.9%都是看譯文,原文只看了幾篇,主要是軟體項目管理、開發文章,看完所有譯文後,己停看,不過文章具有啟發性,所以沒看過還是推薦看一下。

2012年7月4日 星期三

收集的Bitswise 技術連結

使用 Bitswise

好處:
有效率,速度快、佔用空間能最小化

缺點:
可讀性低,只能處理固定長度問題,另外,因為多個變數的值使用一個變數儲存,如果一個變數出錯會影響到多個變數。

連結:
http://edisonx.pixnet.net/blog/post/34033421

http://puremonkey2010.blogspot.hk/2011/05/c-bitwise-operation.html

http://kuoe0.ch/1436/

http://kuoe0.ch/1503/

http://www.aggregate.org/MAGIC/



http://onjava.com/pub/a/onjava/2005/02/02/bitsets.html?page=1



http://www.vipan.com/htdocs/bitwisehelp.html

http://graphics.stanford.edu/~seander/bithacks.html

書:
 Hacker's Delight
http://www.hackersdelight.org/ 



傳奇故事: 使用神奇 bitswise 技巧比使用 cpu SSE指令rsqrtss計算更快的故事
平方根倒數速演算法 - 维基百科,自由的百科全书
[C] InvSqrt (平方根倒數) @ Edison.X. Blog :: 痞客邦 PIXNET ::
一個Sqrt函數引發的血案


延伸閱讀:  
http://en.wikipedia.org/wiki/Bitwise_operation

[內容已失效] blogger 內嵌 skydrive, kiwi6 分享目錄測試

blogger 內嵌 skydrive 分享目錄測試



skydrive 的在部落格或網頁中內嵌「資料夾」,原來只是一個icon加上一個連結的功能。



kiwi6.com 分享 mp3 檔案測試

 港台節目 - 生活也是哲學
 
目錄:
01 甚麼是生活? 甚麼是哲學?
02 為什麼生活也是哲學?
03 after facebook
04 甚麼是幸福?
05 幸福與悲觀主義
06 苦樂相生
07 最後的儀式
08 命不由我?
09 死亡的意義
10 古代旅遊哲學
11 現代旅遊哲學
12 旅行的意義
13 人為什麼要工作?
14 中西方的工作價值觀
15 工作與閑暇
16 求名就是求愛?
17 勢利鬼與無名卒
18 不庸俗,便孤獨?
19 花園學派的哲學治療(I)遠離政治
20 花園學派的哲學治療(II)神無懼,死無憂
21 花園學派的哲學治療(III) 樂可得 苦可忍 - 欲望的棄與取
22 超越世俗追求的莊子
24 相忘江湖的處世哲學
23 外生死尚自然的莊子
25 愛情之盛況
26 愛情之懷疑
27 愛情之繁衍
28 信仰
30 人性
29 宗教
31 語言是什麼
32 語言與思維
33 語言多樣性
34 教育的目的
35 母語與教育
37 命定?
36 國民教育
38 悲劇
39 未來歷史的主人
40 烏托邦
41 柏拉圖的理想國
42 如何建立烏托邦
43 真假 (上)
44 真假 (下)

.

skydrive 上載的檔案名稱不可以包括全形問號的解決方法

就是沒有方法可以解決,像 windows 中檔案不能包含限制的字元


正斜線 ( / )

反斜線 ( \ )

冒號 ( : )

星號 ( * )

問號 ( ? )

小於符號 ( < )

大於符號 ( > )

垂直線 ( | )

分號 ( ; )

引號 ( " )



skydrive 上傳的檔案也不能包括以上符號的檔案名稱,全形問號(﹖) 也不可以,只能使用外型近似全形問號(﹖)的小問題 「小問號(SMALL QUESTION MARK)」「」U+FE56,源自 CNS 11643Big5  代替。


ref:

問號 - 维基百科,自由的百科全书

2012年6月26日 星期二

使用 VirtualBox 代替 Android SDK 的 Emulator

開發一個 Android App 難免需要一個模擬機去測試運作效果

一般來說模擬有三個方法

1. 使用真實 Android 手機測試 (將手機設定為 debug mode用USB線與PC連接)
2. 使用 Android SDK 的 Emulator (跑得很慢)
3. 使用 VirtualBox 代替 Android SDK 的 Emulator (只說 windows下設定)


這裡說的是第三個方法的心得,怎樣設定才最簡單、方便,不是 Step by Step的畫面教學。


1. 在 VirtualBox 中的虛擬機中的 Network Attached to 選用 NAT (轉址方法),在 Port Forward 中,按 "+"號新增一個虛擬機與 HostPC溝通的 Port Forwarding Rules,Rule 1,在 Host Port 輸入 5555,Guest Port 輸入 5555後按OK。

2. 製造一個 ado connect.bat的檔案,輸入以一句的下內容 (以下假設 android-sdk 解壓在 C:\  )

start C:\android-sdk\platform-tools\adb.exe connect localhost

3. 安裝 Escipse並裝上 ADT plugin後,執行 Escipse,不需要在 AVD(Android Virtual Device) Manager中create一個新的 AVD,Run Configuration 中 Target 選 Manual(手動選模擬機)。

4. Escipse 中按 Run 前,double click ado connect.bat 一次,那麼 Escipse 便會認得 Virtualbox 中的虛擬機了,當然同一時間只可以跑一個虛擬機,不要跑多個虛擬機。



註:
adb 全名為 Android Debug Bridge
Android調試橋(ADB)是一種多用途的命令行工具,可以讓你在一個模擬器實例或連接Android的供電設備進行通信,
android-sdk 的 android-sdk\platform-tools\可找到 adb.exe。


延伸閱讀:

使用android x86代替模擬器 step by step

用VirtualBox開啟Android模擬器(Emulator is too slow)

Use adb To Install Google Play Apps To Android 4.0.3 Buildroid In VirtualBox

Introduction of Android Debug Bridge (ADB)

Android模擬器adb命令介紹

ADB經由VirtualBox上的USB Port存取Android硬體





註:

既然是模擬器,那麼打電話,短訊,重力感應,GPS、攝像頭等等功能都不支援,要測試你還是得去弄台真機器調試吧!

2012年6月25日 星期一

轉貼:讓 Eclipse 有類似 intellisense 之自動完成功能

用過 Visual Studio (VS) 的人就會知道 Intellisense 功能有多強大
敲首字便可開始提示,以及大小寫校正,但 Eclipse 預設是沒有開啟這功能的
必須要按 Alt + / 才會出現選單供選擇,對於不習慣按熱鍵的人來說實在是有點不方便

想要開啟如同 VS 首字開始自動提示的功能的話,請照下面步驟

  1. Open Eclipse
  2.  (menu) Windows -> Preferences -> Java -> Editor -> Content Assist
  3.  勾選 Auto-Activation,Auto activation delay 為提示出現的延遲時間,建議可以設為 0
  4.  Auto activation triggers for Java: 原本是 dot 改成 .abcdefghijklmnopqrstuvwxyz(,


現在可以在 Ecplise 中體驗如同 VS 的 Intellisense 功能了

ps. 提示有時可能會有點慢,畢竟是 Java-based 的 IDE,就不要苛求速度了。

延伸閱讀

http://help.eclipse.org/galileo/index.jsp?topic=/org.eclipse.jdt.doc.user/tips/jdt_tips.html

2012年6月20日 星期三

轉貼:VirtualBox 裝上 Android 4.04 試 Apps

下載 VirtualBox image file

  • vbox86p : Built for a “phone”, 480×800 default resolution
  • vbox86t : Built for a “tablet”, 1024×600 default resolution
  • vbox86tp : Built for a “tablet” with phone capabilities, 1024×600 default resolution

buildroid_vbox86t_4.0.4_r1.1-20120610b_gapps_houdini.ova (which also includes gapps) (ARM libs support, use binary translation)


more refs ...
http://keyable.blogspot.tw/2012/ ... ndroid-404-for.html

如果安裝 image file後,看不見有 Google play (Android market),參考以下面連,自己手動裝上 Google play。

http://keyable.blogspot.hk/2012/ ... -apps-includes.html


詳細安裝介紹 (外接連結)
http://januslin.blog.ithome.com.tw/post/1861/154234





已知問題:
一般情況下 youtube 不能顯示畫面,只有聲音,全螢幕才有畫有聲。



Buildroid VM configuration

既然係 PC 大 Monitor上睇

--> resolution 就改大d,例如 1280 x 800 -16, 1366 x 768 -16

DPI 改 240

keyboard 改 Virtual keyboard with physical hotkeys


另外轉貼 hotkeys:

Quick tips for using the VM:

    if you don’t see the mouse on the Android screen, use the VirtualBox menu to disable mouse integration (Host key + I)
    the “Windows Key” corresponds to the Android Home button
    Esc corresponds to the Android back button
    F2 corresponds to the Android menu button
    F3 corresponds to the Android search button
    Alt+F1 => switch to console mode
    Alt+F7 => switch to GUI mode


另外補充一下虛擬機中主頁、返回、關機、菜單對應的鍵盤按鍵

Home鍵 -> Win鍵
返回鍵 -> ESC鍵
掛機鍵 -> alt+F4
菜單鍵 -> 鍵盤菜單鍵,一般在右邊win鍵和ctrl鍵中間




如果遇到 "處理購買交易時發生錯誤。(DF-BPA-13)"

關於這個狀況,應該是最近play商店更新後出現的bug,建議可以使用以下步驟

到設定 --> 應用程式 --> 全部


1. Google Play商店 -->
-->        強制停止
-->        清除資料

2. Google 服務架構
-->        強制停止
-->        清除資料

3. 重開機就行

2012年6月19日 星期二

以JS code 的OO方法實現樹狀結構

出處:hkepc 討論區原貼

效果


 food
       fruit
          Red
             Cherry
          Yellow
             Banana
       Meat
          Beef
          Pork
 

Tree hierarchy: (在 IE 下不能正常運行)



JS code
<script language="javascript">
<!--

var $ = function(_id) {return document.getElementById(_id);};

function Node(nodeName,nodeParentID, indentNum){
        this.nodeName = nodeName;
        this.nodeParentID = nodeParentID;
        this.childNodes = [];
        this.add=function(node){
                        this.childNodes[this.childNodes.length] = node;
                };
}

function createTree(){
        var dataAry = [
/*0*/                ["root"-1],
/*1*/                ["food",0],
/*2*/                ["fruit",1],
/*3*/                ["Meat",1],
/*4*/                ["Red",2],
/*5*/                ["Yellow",2],
/*6*/                ["Cherry",4],
/*7*/                ["Banana",5],
/*8*/                ["Beef",3],
/*9*/                ["Pork",3]
        ];
        
        var tmpAry=[]; 
        for(var i=0;i<dataAry.length;i++){
                tmpAry[tmpAry.length]= new Node(dataAry[i][0], dataAry[i][1]);
        }

        for(var i=1;i<tmpAry.length;i++){
                var parentIdx = dataAry[i][1];
                tmpAry[parentIdx].add(tmpAry[i]);
        }

        return tmpAry[0];
}

var debugtxt = [];

function debug(msg){
        debugtxt[debugtxt.length] = msg;
}


function walkTree(aTreeNode, indent){
        for(var i=0;i<aTreeNode.childNodes.length;i++){
                debug(indent + aTreeNode.childNodes[i].nodeName + "<br/>");
                
                var subNodes = aTreeNode.childNodes[i].childNodes;                                                                
                if (subNodes.length>0) {
                        walkTree(aTreeNode.childNodes[i], "   " + indent);
                }
        }
}

var treeRoot=null;
function printHierarchy(){
        debugtxt = [];        
        treeRoot = createTree();        
        walkTree(treeRoot, "");

        $("tree1").innerHTML = debugtxt.join("");
}

function clearHierarchy(){
        $("tree1").innerHTML = "";
}
//-->
</script>

html code
Tree hierarchy: <br>
<input type="button" onClick="printHierarchy();" value="Print hierarchy">
<input type="button" onClick="clearHierarchy();" value="Clear data">
<div id="tree1"></div>
延伸閱讀:

google 搜索 樹狀結構
php實現樹狀結構無級分類

最簡單的 jquery 樹狀表單範例


  • 第1章 Javascript簡介
  • 第2章 Javascript基礎
  • 第3章 CSS基礎
    • 第3.1節 CSS的概念
    • 第3.2節 使用CSS控制頁面
      • 3.2.1 行內樣式
      • 3.2.2 內嵌式
    • 第3.3節 CSS選擇器
  • 第4章 CSS進階
    • 第4.1節 div標記與span標記
    • 第4.2節 盒子模型
    • 第4.3節 元素的定位
      • 4.3.1 float定位
      • 4.3.2 position定位
      • 4.3.3 z-index空間位置

js code
<script language="javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script language="javascript">
$(function(){
 $("li:has(ul)").click(function(e){
  if(this==e.target){
   if($(this).children().is(":hidden")){
    //如果子項是隱藏的則顯示
    $(this).css("list-style-image","url(http://www.matrox.com/graphics/media/image/style/list_minus.gif)")
    .children().show();
   }else{
    //如果子項是顯示的則隱藏
    $(this).css("list-style-image","url(http://www.matrox.com/graphics/media/image/style/list_plus.gif)")
    .children().hide();
   }
  }
  return false; //避免不必要的事件混繞
 }).css("cursor","pointer").click(); //加載時觸發點擊事件
 
 //對於沒有子項的選單,統一設置
 $("li:not(:has(ul))").css({
  "cursor":"default",
  "list-style-image":"none"
 });
});
</script>

html code
<br />
<ul>
<li>第1章 Javascript簡介</li>
<li>第2章 Javascript基礎</li>
<li>第3章 CSS基礎
  <ul>
<li>第3.1節 CSS的概念</li>
<li>第3.2節 使用CSS控制頁面
    <ul>
<li>3.2.1 行內樣式</li>
<li>3.2.2 內嵌式</li>
</ul>
</li>
<li>第3.3節 CSS選擇器</li>
</ul>
</li>
<li>第4章 CSS進階
  <ul>
<li>第4.1節 div標記與span標記</li>
<li>第4.2節 盒子模型</li>
<li>第4.3節 元素的定位
    <ul>
<li>4.3.1 float定位</li>
<li>4.3.2 position定位</li>
<li>4.3.3 z-index空間位置</li>
</ul>
</li>
</ul>
</li>
</ul>

狼、羊、菜威力加強版問題 C++ 解題

題目:

Lulu has to transfer the cabbage, the goat, the wolf, the stick and the fire from one bank of the river to the other bank.
But there are only two seats available on his boat !

Furthermore, if the goat and the cabbage stay together on a bank as Lulu is leaving on his boat, the goat will eat the cabbage.
If the wolf and the goat stay together as Lulu is leaving, the wolf will eat the goat !
If the stick and the wolf stay together as Lulu is leaving, the stick will beat the wolf !
If the fire and the stick stay together as Lulu is leaving, the fire will burn the stick !

Click on the "items" to place them on the boat or on the bank. Click on the arrow to make the boat cross the river.

There are 2 levels in this game.

Good luck !


Play
http://jeux.lulu.pagesperso-orange.fr/html/anglais/loupChe/loupChe2.htm






#include <iostream>
#include <vector>
using namespace std;

const int TARGET_STATE = 63;  // 111 111b

vector<int> crossSnapshot;
vector<int> takerSnapshot;

void showPauseMsg();

enum{
  FARMER=32, // 100000 b
  WOLF=16, // 010000 b
  GOAT = 8, // 001000 b
  CABBAGE=4, // 000100 b
  FIRE = 2,  // 000010 b
  STICK = 1  // 000001 b
};


//toggle the bit N array
//at bankA = 0, at bankB = 1

int cross[] = {
 FARMER,
 FARMER | WOLF,
 FARMER | GOAT,
 FARMER | CABBAGE,
 FARMER | FIRE,
 FARMER | STICK,

 FARMER | WOLF | GOAT,
 FARMER | WOLF | CABBAGE,
 FARMER | WOLF | FIRE,
 FARMER | WOLF | STICK,

 FARMER | GOAT | CABBAGE,
 FARMER | GOAT | FIRE,
 FARMER | GOAT | STICK,

 FARMER | CABBAGE | FIRE,
 FARMER | CABBAGE | STICK,

 FARMER | FIRE | STICK
};

void printState(int iState){
 //print out Bit N, N start from 0

 int N=6;
 for(int i=N-1;i>=0;i--)
 {
  cout << ((iState >> i ) & 1);//show Bit 3
 }
 cout << endl;
}

int farmer(int iState){
 //get a Bit N of iState, N start from 0
 return ((iState >> 5 ) & 1);
}
int wolf(int iState){
 return ((iState >> 4 ) & 1);
}
int goat(int iState){
 return ((iState >> 3 ) & 1);
}
int cabbage(int iState){
 return ((iState >> 2 ) & 1);
}

int fire(int iState){
 return ((iState >> 1 ) & 1);
}

int stick(int iState){
 return ((iState >> 0 ) & 1);
}

bool isSafe(int state){
 if( goat(state) == wolf(state) &&
  goat(state) != farmer(state))
 {
  return false;
 }

 if( goat(state) == cabbage(state) &&
  goat(state)!=farmer(state))
 {
  return false;
 }

 if( stick(state) == wolf(state) &&
  stick(state) != farmer(state))
 {
  return false;
 }

 if( fire(state) == stick(state) &&
  fire(state) != farmer(state))
 {
  return false;
 }

 return true;
}

bool isTry(int state){
 bool isTried = false;

 for(int j=0; j < crossSnapshot.size();j++){
  //printState(crossSnapshot[j]);

  if (state == crossSnapshot[j]){
   isTried = true;
   break;
  }
 }
 return isTried;
}

void printTaker(int i){
 char* msg[] = {
  "farmer goes alone",
  "farmer takes wolf",
  "farmer takes goat",
  "farmer takes cabbage",
  "farmer takes fire",
  "farmer takes stick",

  "farmer takes wolf & goat",
  "farmer takes wolf & cabbage",
  "farmer takes wolf & fire",
  "farmer takes wolf & stick",

  "farmer takes goat & cabbage",
  "farmer takes goat & fire",
  "farmer takes goat & stick",

  "farmer takes cabbage & fire",
  "farmer takes cabbage & stick",

  "farmer takes fire & stick"
 };

 if(i >= 0 && i <= 15) {
  cout << msg[i] << endl;;
 }
}

void printEveryState(vector<int> &crossSnapshot){
 cout << "total number cross state = " << crossSnapshot.size()<<endl;

 for(int j=0; j < crossSnapshot.size();j++){
  printState(crossSnapshot[j]);
 }
}

void printEveryState2(vector<int> &takerSnapshot){
 cout << "The cross step is show as belowing." << endl;

 for(int j=0; j < takerSnapshot.size();j++){
  cout << j+1 << ". ";
  printTaker(takerSnapshot[j]);
 }

 cout <<endl;
}

void recordTriedState(int state, int i, vector<int> &crossSnapshot){
 //save snapshot
 crossSnapshot.push_back(state);
 takerSnapshot.push_back(i);
}

void RollbackRecordState(int state, vector<int> &crossSnapshot){
 //delete previous snapshot
 crossSnapshot.pop_back();
 takerSnapshot.pop_back();
}

void crossRiver(int state, vector<int> &crossSnapshot){
 if (state == TARGET_STATE){
  //printEveryState(crossSnapshot);
  printEveryState2(takerSnapshot);
  //stop recurive iteration

  showPauseMsg();
  exit(0);
  return;
 }

 //for every cross choice
 for(int i=0; i< 15; i++){

  int boat = (crossSnapshot.size()+1) % 2; //0 or 1, 0 at banka, 1 at bankb
  int mover = cross[i];

  if(boat==0)
  {
   if ((state & mover)!= 0){ continue; }
  }
  else
  {
   if ((state & mover)!= mover){ continue; }
  }

  int nextCrossState = state ^ cross[i];

  if(isSafe(nextCrossState) && !isTry(nextCrossState)){
   recordTriedState(nextCrossState, i, crossSnapshot);

   //printTaker(i, state);
   //recurive to call itself
   crossRiver(nextCrossState, crossSnapshot);

   RollbackRecordState(nextCrossState, crossSnapshot);
  }
 }
}

void showPauseMsg(){
    cout << "Press any key to be continue" << endl;
 getchar();
}

int main() {
 int initialState = 0;

 //save first snapshot
 crossSnapshot.push_back(initialState);

 crossRiver(initialState, crossSnapshot);
 showPauseMsg();
 return 0;
}
 
 
Output:

The cross step is show as belowing.
1. farmer takes goat & stick
2. farmer goes alone
3. farmer takes wolf
4. farmer takes wolf & goat
5. farmer takes wolf & cabbage
6. farmer takes wolf
7. farmer takes goat
8. farmer takes goat & stick
9. farmer takes wolf & fire
10. farmer goes alone
11. farmer takes goat & stick

Press any key to be continue

狼、羊、菜問題 C++ 解題

古老的智力遊戲題其實最適合用 functional language 或 logic language 或 AI language (Prolog)去解,但這解題的程式碼是我多年前寫下的,懶得修改,只貼出來留念,有興趣的人可以用更適合 language去解題,程式應該是少很多,而且解題思路會更清晰。

問題:

一個農夫帶著一只狼,一只羊和一籃菜回家,途中要過一條河,唯一的渡河工具是一條小船,因為船真的是太小了,農夫最多只能帶三樣東西的其中一件划船過河;可是,要是農夫不在旁的話,狼會咬羊,羊會吃菜,農夫應怎樣過河才可使得羊和菜都無損呢?



 

#include <iostream>
#include <vector>
using namespace std;

const int TARGET_STATE = 15;  // 1111b

vector<int> crossSnapshot;
vector<int> takerSnapshot;

enum{
  FARMER=8, // 1000 b
  WOLF=4, // 0100 b
  GOAT = 2, // 0010 b
  CABBAGE=1 // 0001 b
};


//toggle the bit N array
//at bankA = 0, at bankB = 1

int cross[] = {
 FARMER, //FARMER  //1000b, 8, Farmer at bankB
 FARMER | WOLF, //FARMER, WOLF //1100b, 12
 FARMER | GOAT, //FARMER, GOAT //1010b, 10
 FARMER | CABBAGE //FARMER,CABBAGE //1001b, 9
};

void printState(int iState){
 //print out Bit N, N start from 0

 int N=4;
 for(int i=N-1;i>=0;i--)
 {
  cout << ((iState >> i ) & 1);//show Bit 3
 }
 cout << endl;
}


int farmer(int iState){
 //get a Bit N of iState, N start from 0
 return ((iState >> 3 ) & 1);
}
int wolf(int iState){
 return ((iState >> 2 ) & 1);
}
int goat(int iState){
 return ((iState >> 1 ) & 1);
}
int cabbage(int iState){
 return ((iState >> 0 ) & 1);
}

bool isSafe(int state){
 if( goat(state) == wolf(state) &&
  goat(state) != farmer(state))
 {
  return false;
 }

 if( goat(state) == cabbage(state) &&
  goat(state)!=farmer(state))
 {
  return false;
 }

 return true;
}

bool isTry(int state){
 bool isTried = false;

 for(int j=0; j < crossSnapshot.size();j++){
  //printState(crossSnapshot[j]);

  if (state == crossSnapshot[j]){
   isTried = true;
   break;
  }
 }
 return isTried;
}


void printTaker2(int i){
 char* msg[] = {
  "farmer goes alone",
  "farmer takes wolf",
  "farmer takes goat",
  "farmer takes cabbage"
 };

 if(i >= 0 && i <= 3) {
  cout << msg[i] << endl;;
 }
}

void printEveryState(vector<int> &crossSnapshot){
 cout << "total number cross state = " << crossSnapshot.size()<<endl;

 for(int j=0; j < crossSnapshot.size();j++){
  printState(crossSnapshot[j]);
  //printTaker2(crossSnapshot[j]);
 }
}

void printEveryState2(vector<int> &takerSnapshot){
 cout << "The cross step is show as belowing." << endl;

 for(int j=0; j < takerSnapshot.size();j++){
  cout << j+1 << ". ";
  printTaker2(takerSnapshot[j]);
 }

 cout <<endl;
}

void recordTriedState(int state, int i, vector<int> &crossSnapshot){
 //save snapshot
 crossSnapshot.push_back(state);
 takerSnapshot.push_back(i);
}

void RollbackRecordState(int state, vector<int> &crossSnapshot){
 //delete previous snapshot
 crossSnapshot.pop_back();
 takerSnapshot.pop_back();
}

void crossRiver(int state, vector<int> &crossSnapshot){
 if (state == TARGET_STATE){
  //printEveryState(crossSnapshot);
  printEveryState2(takerSnapshot);
  //stop recurive iteration
  return;
 }

 //for every cross choice
 for(int i=0; i<4; i++){
  int nextCrossState = state ^ cross[i]; // use bitwise^ to toggle the Bit i

  if(isSafe(nextCrossState) && !isTry(nextCrossState)){
   recordTriedState(nextCrossState, i, crossSnapshot);

   //printTaker(i, state);
   //recurive to call itself
   crossRiver(nextCrossState, crossSnapshot);

   RollbackRecordState(nextCrossState, crossSnapshot);
  }
 }
}

int main() {
 int initialState = 0;

 //save first snapshot
 crossSnapshot.push_back(initialState);

 crossRiver(initialState, crossSnapshot);

    cout << "Press any key to be continue" << endl;
 getchar();
 return 0;
} 


Output:

The cross step is show as belowing.
1. farmer takes goat
2. farmer goes alone
3. farmer takes wolf
4. farmer takes goat
5. farmer takes cabbage
6. farmer goes alone
7. farmer takes goat

The cross step is show as belowing.
1. farmer takes goat
2. farmer goes alone
3. farmer takes cabbage
4. farmer takes goat
5. farmer takes wolf
6. farmer goes alone
7. farmer takes goat

Press any key to be continue

 
延伸閱讀:

狐狸、鵝、豆子問題 - 維基百科,自由的百科全書

http://en.wikipedia.org/wiki/Fox,_goose_and_bag_of_beans_puzzle

 數學遊戲與欣賞 - 過河問題

渡河問題 - 维基百科,自由的百科全书


過河問題的圖論解法 - 那個誰 - CSDNBlog

黑夜過橋 C++ 解題



    請幫助一家五口在黑夜中過河。

    注意事項:

    1.因為是黑夜,他們必須帶備燈。
    2.每位家庭成員都有不同的速度過橋,由1秒、3秒、6秒、8秒、到12秒。
    3.橋只可最多承受2人的重量。
    4.當2人同時在橋上行走,速度必跟隨較慢的一位。
    5.燈只足夠維持30秒。


#include <iostream>
#include <string>
#include <vector>

using namespace std;

const int TARGET_STATE = 64-1;  //  111 111b

vector<int> crossSnapshot;
vector<int> takerSnapshot;

void showPauseMsg();

enum{
 lamp=32,
 m12=16,
 m8=8,
 m6=4,
 m3=2,
 m1=1
};

int cross[] = {
 m12, m8, m6, m3, m1,
 m12|m8, m12|m6, m12|m3, m12|m1,
 m8|m6, m8|m3, m8|m1,
 m6|m3, m6|m1,
 m3|m1
};

int crossCost[]={
 12, 8, 6, 3, 1,
 12, 12, 12, 12,
 8,8,8,
 6,6,
 3
};

int crossUppIdx = (sizeof(cross)/ sizeof(int))-1;

void printState(int iState){
 //print out Bit N, N start from 0

 int N=8;
 for(int i=N-1;i>=0;i--)
 {
  cout << ((iState >> i ) & 1);//show Bit 3
 }
 cout << endl;
}

//get a binary digit N of iNumber, N start from Right to Left
// Rightmost is 1
//return 0 or 1, Bit N at iNumber

int getBitN(int iNumber, int N){
 return (iNumber >> (N-1)) & 1;
}

int getLampState (int iState){ return getBitN(iState, 6);}

bool isSafe(vector<int> &takerSnapshot, int addCost){
 int sum =0;

 for(int j=0; j<takerSnapshot.size();j++){
  sum += crossCost[takerSnapshot[j]];
 }

 sum += addCost;

 if (sum >30){ return false;}

 return true;
}

bool isTry(int state){
 bool isTried = false;

 for(int j=0; j < crossSnapshot.size();j++){
  if (state == crossSnapshot[j]){
   isTried = true;
   break;
  }
 }
 return isTried;
}

void printTaker(int i){
 char* msg[] = {
  "12", "8", "6", "3", "1",
  "(12,8)", "(12,6)", "(12,3)", "(12,1)",
  "(8,6)", "(8,3)", "(8,1)",
  "(6,3)", "(6,1)",
  "(3,1)"
 };

 if(i >= 0 && i <= crossUppIdx) {
  cout << msg[i] << endl;
 }
}

string getTaker(int i){
 char* msg[] = {
  "12", "8", "6", "3", "1",
  "(12,8)", "(12,6)", "(12,3)", "(12,1)",
  "(8,6)", "(8,3)", "(8,1)",
  "(6,3)", "(6,1)",
  "(3,1)"
 };

 if(i >= 0 && i <= crossUppIdx) {
  return string(msg[i]);
 }

 return string("");
}

void printEveryBitState(vector<int> &crossSnapshot){
 cout << "total number cross state = " << crossSnapshot.size()<<endl;

 for(int j=0; j < crossSnapshot.size();j++){
  printState(crossSnapshot[j]);
 }
}

void printEveryWordState(vector<int> &takerSnapshot){
 cout << "The cross step is show as belowing." << endl;

 for(int j=0; j < takerSnapshot.size();j++){
  cout << j+1 << ". ";
  cout << getTaker(takerSnapshot[j]);

  if (j%2 == 0){
   cout << " <---" << endl;
  } else {
   cout << " --->"<< endl;
  }
 }
 //add a dummy blank line
 cout <<endl;
}

void printTotalMins(vector<int> &takerSnapshot){
 int totalMins = 0;

 for(int j=0; j < takerSnapshot.size();j++){
  totalMins += crossCost[takerSnapshot[j]];
 }

 cout << "total mins used = " << totalMins << endl;
}

void recordTriedState(int state, int i, vector<int> &crossSnapshot){
 //save snapshot
 crossSnapshot.push_back(state);
 takerSnapshot.push_back(i);
}

void RollbackRecordState(int state, vector<int> &crossSnapshot){
 //delete previous snapshot

 //cout << "roll back ...." << endl << endl;
 //printEveryWordState(takerSnapshot);
 //printEveryBitState(crossSnapshot);

 crossSnapshot.pop_back();
 takerSnapshot.pop_back();
}

bool isMoverSameSideWithBoat(int currentState, int mover){
 bool rv = false;
 int lampState = getLampState(currentState);

 if(lampState==0)
 {
  if ((currentState & mover) == 0){ rv = true; }
 }
 else
 {
  if ((currentState & mover)== mover){ rv = true;  }
 }

 return rv;
}

void crossRiver(int state,
    vector<int> &crossSnapshot)
{
 if (state == TARGET_STATE){
  //printEveryBitState(crossSnapshot);
  printEveryWordState(takerSnapshot);
  printTotalMins(takerSnapshot);

  //stop recurive iteration
  showPauseMsg(); // if u want to print similarly answer, hide this code
  exit(0);  // if u want to print similarly answer, hide this code
  return;
 }

 //for every cross choice
 for(int i=0; i<=crossUppIdx; i++){
  int mover = cross[i];

  bool isMoverSameWithBoat = isMoverSameSideWithBoat(state, mover);

  // if mover object is not same side as boat
  if (!isMoverSameWithBoat){
   continue;
  }

  int nextCrossState = (state ^ mover) ^ lamp; // use bitwise^ to toggle the Bit i

  bool isSafed = isSafe(takerSnapshot, crossCost[i]);

  bool isNotTry = (!isTry(nextCrossState));

  if( isSafed && isNotTry ){
   //printState(nextCrossState);
   //printTaker(i);

   //int x = takerSnapshot.size();
   recordTriedState(nextCrossState, i, crossSnapshot);
   //recurive to call itself
   crossRiver(nextCrossState, crossSnapshot);

   RollbackRecordState(nextCrossState, crossSnapshot);
  }
 }
}

void showPauseMsg(){
    cout << "Press any key to be continue" << endl;
 getchar();
}

int main() {
 //save first snapshot
 crossSnapshot.push_back(0);

 crossRiver(0, crossSnapshot);

 //showPauseMsg();
 return 0;
}


The cross step is show as belowing.
1. (6,1) <---
2. 1 --->
3. (3,1) <---
4. 3 --->
5. (12,8) <---
6. 1 --->
7. (3,1) <---

total mins used = 29
Press any key to be continue

延伸閱讀:

其他人的文章,如果是 N個人一共只帶了一只手電筒等變形問題的版本
http://blog.csdn.net/wuzhekai1985/article/details/6846934

http://renren.it/a/bianchengyuyan/_NET/20111006/133147.html


黑夜過橋問題是可遞迴解的

一家六口過河問題 C++解題

一家六口過河問題 C++解題 出處不知,有多個變化身份的版本

版本1

一家庭欲過河.成員為:爸爸.媽媽.哥哥.姊姊.弟弟.妹妹.僕人.與一隻狗...
過河條件如下:
1.僅有一條小船可供渡河.每次最多搭乘2人(含駕駛)..且僅有爸爸.媽媽.僕人這3人會駕船..
2.爸爸不在兄弟身邊時.媽媽會打兄弟..
3.媽媽不在姊妹身邊時.爸爸會打姊妹..
4.僕人不在狗身邊時.狗會咬其他人..
請問這家人要如何平安過河?


版本2:


http://res.hkedcity.net/general/0001/51/31/riverIQGame.swf



全家人一起到郊外野餐,原本是歡樂的氣氛,卻碰到了逃獄的囚犯的襲擊,所幸逮捕他的警察也即時趕到,全家人因此暫時沒有危險了...;在警察一邊要保護全家人,一邊要看緊囚犯的路上,來到了一個需要過河的地方,但是只有一艘只能同時在兩人的小船,爸爸、媽媽、兩個兒子與兩個女兒,加上一名囚犯與一名警察這8個人該如何順利過河呢?


操作說明:

用滑鼠點選要乘船的人,在點選紅色拉桿,就可以過河。 注意,這家人有點...奇怪:

1.爸爸不可以在沒有媽媽的情況下跟女兒在一起,女兒會被責罵。

2.媽媽不可以在沒有爸爸的情況下跟兒子在一起,兒子會被修理。

3.囚犯不可以在沒有警察的情況下跟其他人在一起,囚犯會傷害他人。


這個版本被人用 flash 製造出來,有良好互動效果,所以就用這個題目做練習吧!

其他類似版本 iPad, iPhone

link


#include <iostream>
#include <string>
#include <vector>

using namespace std;

const int TARGET_STATE = 512-1;  // 1 1111 1111b

vector<int> crossSnapshot;
vector<string> takerSnapshot;

void showPauseMsg();

enum{
 Boat=256,
 Father=128,
 Mather=64,
 Police=32,
 Thief=16,

 Boy1=8,
 Boy2=4,
 Girl1=2,
 Girl2=1
};


int cross[] = {
 Father,//0
 Mather,
 Police,
 Father|Mather,
 Father|Police,
 Father|Boy1,
 Father|Boy2,

 Mather|Police,
 Mather|Girl1,
 Mather|Girl2,

 Police|Thief,
 Police|Boy1,
 Police|Boy2,
 Police|Girl1,
 Police|Girl2
};
int crossUppIdx = 14;

void printState(int iState){
 //print out Bit N, N start from 0

 int N=8;
 for(int i=N-1;i>=0;i--)
 {
  cout << ((iState >> i ) & 1);//show Bit 3
 }
 cout << endl;
}

//get a binary digit N of iNumber, N start from Right to Left
// Rightmost is 1
//return 0 or 1, Bit N at iNumber

int getBitN(int iNumber, int N){
 return (iNumber >> (N-1)) & 1;
}

int getBoatState (int iState){ return getBitN(iState, 9);}

int father (int iState){ return getBitN(iState, 8);}
int mother (int iState){ return getBitN(iState, 7);}
int police (int iState){ return getBitN(iState, 6);}
int thief  (int iState){ return getBitN(iState, 5);}
int boy1 (int iState){ return getBitN(iState, 4);}
int boy2(int iState){ return getBitN(iState, 3);}
int girl1(int iState){ return getBitN(iState, 2);}
int girl2(int iState){ return getBitN(iState, 1);}


bool isSafe(int state){
 if( police(state) != thief(state)
  && (thief(state) == father(state) ||
   thief(state) == mother(state) ||
   thief(state) == boy1(state) ||
   thief(state) == boy2(state) ||
   thief(state) == girl1(state) ||
   thief(state) == girl2(state))
  )
 {
  return false;
 }

 if( father(state)!= mother(state) &&
  (father(state) == girl1(state) ||
   father(state) == girl2(state))
  )
 {
  return false;
 }

 if( mother(state)!= father(state) &&
  (mother(state) == boy1(state) ||
   mother(state) == boy2(state))
  )
 {
  return false;
 }
 return true;
}

bool isTry(int state){
 bool isTried = false;

 for(int j=0; j < crossSnapshot.size();j++){
  //printState(crossSnapshot[j]);

  if (state == crossSnapshot[j]){
   isTried = true;
   break;
  }
 }
 return isTried;
}

void printTaker(int i){
 char* msg[] = {
  "father, _____",
  "mother, _____",
  "police, _____",

  "father, mother",
  "father, police",

  "father, boy1",
  "father, boy2",

  "mother, police",
  "mother, girl1",
  "mother, girl2",

  "police, thief",
  "police, boy1",
  "police, boy2",
  "police, girl1",
  "police, girl2"
 };

 if(i >= 0 && i <= crossUppIdx) {
  cout << msg[i] << endl;
 }
}


string getTaker(int i){
 char* msg[] = {
  "father, _____",
  "mother, _____",
  "police, _____",

  "father, mother",
  "father, police",

  "father, boy1",
  "father, boy2",

  "mother, police",
  "mother, girl1",
  "mother, girl2",

  "police, thief",
  "police, boy1",
  "police, boy2",
  "police, girl1",
  "police, girl2"
 };

 if(i >= 0 && i <= crossUppIdx) {
  return string(msg[i]);
 }

 return string("");
}

void printEveryBitState(vector<int> &crossSnapshot){
 cout << "total number cross state = " << crossSnapshot.size()<<endl;

 for(int j=0; j < crossSnapshot.size();j++){
  printState(crossSnapshot[j]);
 }
}

void printEveryWordState(vector<string> &takerSnapshot){
 cout << "The cross step is show as belowing." << endl;

 for(int j=0; j < takerSnapshot.size();j++){
  cout << j+1 << ". ";
  cout << takerSnapshot[j];

  if (j%2 == 0){
   cout << " --->" << endl;
  } else {
   cout << " <---"<< endl;
  }
 }
 //add a dummy blank line
 cout <<endl;
}

void recordTriedState(int state, int i, vector<int> &crossSnapshot){
 //save snapshot
 crossSnapshot.push_back(state);
 takerSnapshot.push_back(getTaker(i));
}

void RollbackRecordState(int state, vector<int> &crossSnapshot){
 //delete previous snapshot

 //cout << "roll back ...." << endl << endl;
 //printEveryWordState(takerSnapshot);
 //printEveryBitState(crossSnapshot);

 crossSnapshot.pop_back();
 takerSnapshot.pop_back();
}

bool isMoverSameSideWithBoat(int currentState, int mover){
 bool rv = false;
 int boat = getBoatState(currentState);

 if(boat==0)
 {
  if ((currentState & mover) == 0){ rv = true; }
 }
 else
 {
  if ((currentState & mover)== mover){ rv = true;  }
 }

 return rv;
}

void crossRiver(int state, vector<int> &crossSnapshot){
 if (state == TARGET_STATE){
  //printEveryBitState(crossSnapshot);
  printEveryWordState(takerSnapshot);
  //stop recurive iteration

  showPauseMsg(); // if u want to print similarly answer, hide this code
  exit(0);  // if u want to print similarly answer, hide this code
  return;
 }

 //for every cross choice
 for(int i=0; i<=crossUppIdx; i++){
  int mover = cross[i];

  bool isMoverSameWithBoat = isMoverSameSideWithBoat(state, mover);

  // if mover object is not same side as boat
  if (!isMoverSameWithBoat){
   continue;
  }

  int nextCrossState = (state ^ mover) ^ Boat; // use bitwise^ to toggle the Bit i

  bool isSafed = isSafe(nextCrossState);
  bool isNotTry = (!isTry(nextCrossState));

  if( isSafed && isNotTry ){
   //printState(nextCrossState);
   //printTaker(i);

   //int x = takerSnapshot.size();
   recordTriedState(nextCrossState, i, crossSnapshot);
   //recurive to call itself
   crossRiver(nextCrossState, crossSnapshot);

   RollbackRecordState(nextCrossState, crossSnapshot);
  }
 }
}

void showPauseMsg(){
    cout << "Press any key to be continue" << endl;
 getchar();
}

int main() {
 int initialState = 0;

 //save first snapshot
 crossSnapshot.push_back(initialState);
 crossRiver(initialState, crossSnapshot);

 //showPauseMsg();
 return 0;
}


Output: 結果



The cross step is show as belowing.

1. police, thief --->
2. police, _____ <---
3. police, boy1 --->
4. police, thief <---
5. father, boy2 --->
6. father, _____ <---
7. father, mother --->
8. mother, _____ <---
9. police, thief --->
10. father, _____ <---
11. father, mother --->
12. mother, _____ <---
13. mother, girl1 --->
14. police, thief <---
15. police, girl2 --->
16. police, _____ <---
17. police, thief --->

Press any key to be continue


-------------------------------------------------

DOS/capture screen output to a file

click the control menu button on a command window (you can find this button on the left upper corner). Or press Alt + space_bar.

Once the control menu opens, select Edit. From there you can Select All, Mark, or Copy the text you require from the command window.

This text is then copied to the standard Windows clipboard. From there you can paste it in another Windows program.

2012年6月6日 星期三

在 Blogger 使用syntaxhighlighter 3.0

Demo
/**
 * SyntaxHighlighter
 */
public class HelloWorld {

 private static String text = "Hello World!"; 
 
 // Test
 public static void main(String[] arg){
  System.out.println(" - " + text + " - ");
 }
}
步驟1. 登入您的 Blogger。
步驟2. 點選[版面配置]\[範本]\[修改 HTML]。
步驟3. 請以下的範例,複製到 標籤的前面。
<!-- SyntaxHighlighter 3.0.83-->
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/>
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shAutoloader.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushAS3.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushColdFusion.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCSharp.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCpp.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushDelphi.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushDiff.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushErlang.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushGroovy.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJavaFX.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPerl.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPlain.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPowerShell.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPython.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushRuby.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushScala.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushVb.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js' type='text/javascript'/>
步驟4. 找尋 "< / body>"標籤,並在標籤前加入以下字串
    <!-- SyntaxHighlighter 3.0.83-->
    <script type='text/javascript'>
    SyntaxHighlighter.config.bloggerMode = true;
    SyntaxHighlighter.all()
    </script>
步驟5. 進入文章編輯,並切換為"修改HTML"模式
下面方法在加入字串時,特殊符號 "<" 、 ">" 需先轉換好,否則會出現HTML
    <pre class="brush: java">
    ...
    // 程式碼
    ...
    </pre>
SyntaxHighlighter uses separate syntax files called brushes to define its highlighting functionality.

Brush nameBrush aliasesFile name
ActionScript3as3, actionscript3shBrushAS3.js
Bash/shellbash, shellshBrushBash.js
ColdFusioncf, coldfusionshBrushColdFusion.js
C#c-sharp, csharpshBrushCSharp.js
C++cpp, cshBrushCpp.js
CSScssshBrushCss.js
Delphidelphi, pas, pascalshBrushDelphi.js
Diffdiff, patchshBrushDiff.js
Erlangerl, erlangshBrushErlang.js
GroovygroovyshBrushGroovy.js
JavaScriptjs, jscript, javascriptshBrushJScript.js
JavajavashBrushJava.js
JavaFXjfx, javafxshBrushJavaFX.js
Perlperl, plshBrushPerl.js
PHPphpshBrushPhp.js
Plain Textplain, textshBrushPlain.js
PowerShellps, powershellshBrushPowerShell.js
Pythonpy, pythonshBrushPython.js
Rubyrails, ror, rubyshBrushRuby.js
ScalascalashBrushScala.js
SQLsqlshBrushSql.js
Visual Basicvb, vbnetshBrushVb.js
XMLxml, xhtml, xslt, html, xhtmlshBrushXml.js

2012年6月5日 星期二

四層動態連動下拉選單例子




Path:

三層動態連動下拉選單例子