Gray碼

引用Matrix67
Gray碼 假如我有4個潛在的GF澳化,我需要決定最終到底和誰在一起蒋纬。一個簡單的辦法就是,依次和每個MM交往一段時間狡逢,最后選擇給我?guī)淼摹皾M意度”最大的MM。但看了dd牛的理論后拼卵,事情開始變得復(fù)雜了:我可以選擇和多個MM在一起。這樣蛮艰,需要考核的狀態(tài)變成了2^4=16種(當(dāng)然包括0000這一狀態(tài)腋腮,因為我有可能是玻璃)∪副耍現(xiàn)在的問題就是,我應(yīng)該用什么順序來遍歷這16種狀態(tài)呢即寡? 傳統(tǒng)的做法是徊哑,用二進制數(shù)的順序來遍歷所有可能的組合。也就是說聪富,我需要以0000->0001->0010->0011->0100->…->1111這樣的順序?qū)γ糠N狀態(tài)進行測試莺丑。這個順序很不科學(xué),很多時候狀態(tài)的轉(zhuǎn)移都很耗時墩蔓。比如從0111到1000時我需要暫時甩掉當(dāng)前所有的3個MM梢莽,然后去把第4個MM。同時改變所有MM與我的關(guān)系是一件何等巨大的工程啊奸披。因此昏名,我希望知道,是否有一種方法可以使得阵面,從沒有MM這一狀態(tài)出發(fā)轻局,每次只改變我和一個MM的關(guān)系(追或者甩),15次操作后恰好遍歷完所有可能的組合(最終狀態(tài)不一定是1111)样刷。大家自己先試一試看行不行仑扑。 解決這個問題的方法很巧妙。我們來說明置鼻,假如我們已經(jīng)知道了n=2時的合法遍歷順序镇饮,我們?nèi)绾蔚玫絥=3的遍歷順序。顯然沃疮,n=2的遍歷順序如下:
00011110
你可能已經(jīng)想到了如何把上面的遍歷順序擴展到n=3的情況盒让。n=3時一共有8種狀態(tài),其中前面4個把n=2的遍歷順序照搬下來司蔬,然后把它們對稱翻折下去并在最前面加上1作為后面4個狀態(tài):
000001011010 ↑——–110 ↓111101100
用這種方法得到的遍歷順序顯然符合要求邑茄。首先,上面8個狀態(tài)恰好是n=3時的所有8種組合俊啼,因為它們是在n=2的全部四種組合的基礎(chǔ)上考慮選不選第3個元素所得到的肺缕。然后我們看到,后面一半的狀態(tài)應(yīng)該和前面一半一樣滿足“相鄰狀態(tài)間僅一位不同”的限制授帕,而“鏡面”處則是最前面那一位數(shù)不同同木。再次翻折三階遍歷順序,我們就得到了剛才的問題的答案:
0000000100110010011001110101010011001101111111101010101110011000
這種遍歷順序作為一種編碼方式存在跛十,叫做Gray碼(寫個中文讓蜘蛛來抓:格雷碼)彤路。它的應(yīng)用范圍很廣。比如芥映,n階的Gray碼相當(dāng)于在n維立方體上的Hamilton回路洲尊,因為沿著立方體上的邊走一步远豺,n維坐標(biāo)中只會有一個值改變。再比如坞嘀,Gray碼和Hanoi塔問題等價躯护。Gray碼改變的是第幾個數(shù),Hanoi塔就該移動哪個盤子丽涩。比如棺滞,3階的Gray碼每次改變的元素所在位置依次為1-2-1-3-1-2-1,這正好是3階Hanoi塔每次移動盤子編號矢渊。如果我們可以快速求出Gray碼的第n個數(shù)是多少继准,我們就可以輸出任意步數(shù)后Hanoi塔的移動步驟。現(xiàn)在我告訴你昆淡,Gray碼的第n個數(shù)(從0算起)是n xor (n shr 1)锰瘸,你能想出來這是為什么嗎?先自己想想吧昂灵。
下面我們把二進制數(shù)和Gray碼都寫在下面避凝,可以看到左邊的數(shù)異或自身右移的結(jié)果就等于右邊的數(shù)。
二進制數(shù) Gray碼 000 000 001 001 010 011 011 010 100 110 101 111 110 101 111 100
從二進制數(shù)的角度看眨补,“鏡像”位置上的數(shù)即是對原數(shù)進行not運算后的結(jié)果管削。比如,第3個數(shù)010和倒數(shù)第3個數(shù)101的每一位都正好相反撑螺。假設(shè)這兩個數(shù)分別為x和y含思,那么x xor (x shr 1)和y xor (y shr 1)的結(jié)果只有一點不同:后者的首位是1,前者的首位是0甘晤。而這正好是Gray碼的生成方法含潘。這就說明了,Gray碼的第n個數(shù)確實是n xor (n shr 1)线婚。
? 今年四月份mashuo給我看了這道題遏弱,是二維意義上的Gray碼。題目大意是說塞弊,把0到2(n+m)-1的數(shù)寫成2n * 2^m的矩陣漱逸,使得位置相鄰兩數(shù)的二進制表示只有一位之差。答案其實很簡單游沿,所有數(shù)都是由m位的Gray碼和n位Gray碼拼接而成饰抒,需要用左移操作和or運算完成。完整的代碼如下:

  var   x,y,m,n,u:longint;
  begin   
    readln(m,n);   
    for x:=0 to 1 shl m-1 do 
      begin      
        u:=(x xor (x shr 1)) shl n; //輸出數(shù)的左邊是一個m位的Gray碼      
        for y:=0 to 1 shl n-1 do         
          write(u or (y xor (y shr 1)),' '); //并上一個n位Gray碼      
         writeln;   
      end;
  end.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诀黍,一起剝皮案震驚了整個濱河市袋坑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌眯勾,老刑警劉巖咒彤,帶你破解...
    沈念sama閱讀 211,423評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疆柔,死亡現(xiàn)場離奇詭異,居然都是意外死亡镶柱,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評論 2 385
  • 文/潘曉璐 我一進店門模叙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來歇拆,“玉大人,你說我怎么就攤上這事范咨」拭伲” “怎么了?”我有些...
    開封第一講書人閱讀 157,019評論 0 348
  • 文/不壞的土叔 我叫張陵渠啊,是天一觀的道長输吏。 經(jīng)常有香客問我,道長替蛉,這世上最難降的妖魔是什么贯溅? 我笑而不...
    開封第一講書人閱讀 56,443評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮躲查,結(jié)果婚禮上它浅,老公的妹妹穿的比我還像新娘。我一直安慰自己镣煮,他們只是感情好姐霍,可當(dāng)我...
    茶點故事閱讀 65,535評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著典唇,像睡著了一般镊折。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上介衔,一...
    開封第一講書人閱讀 49,798評論 1 290
  • 那天恨胚,我揣著相機與錄音,去河邊找鬼夜牡。 笑死与纽,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的塘装。 我是一名探鬼主播急迂,決...
    沈念sama閱讀 38,941評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蹦肴!你這毒婦竟也來了僚碎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,704評論 0 266
  • 序言:老撾萬榮一對情侶失蹤阴幌,失蹤者是張志新(化名)和其女友劉穎勺阐,沒想到半個月后卷中,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,152評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡渊抽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,494評論 2 327
  • 正文 我和宋清朗相戀三年蟆豫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片懒闷。...
    茶點故事閱讀 38,629評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡十减,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出愤估,到底是詐尸還是另有隱情帮辟,我是刑警寧澤,帶...
    沈念sama閱讀 34,295評論 4 329
  • 正文 年R本政府宣布玩焰,位于F島的核電站由驹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏昔园。R本人自食惡果不足惜蔓榄,卻給世界環(huán)境...
    茶點故事閱讀 39,901評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蒿赢。 院中可真熱鬧润樱,春花似錦、人聲如沸羡棵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽皂冰。三九已至店展,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間秃流,已是汗流浹背赂蕴。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留舶胀,地道東北人概说。 一個月前我還...
    沈念sama閱讀 46,333評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像嚣伐,于是被迫代替她去往敵國和親糖赔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,499評論 2 348

推薦閱讀更多精彩內(nèi)容

  • created by Dejavu[完結(jié)] 介紹Gray碼是一種數(shù)字編碼方式轩端,可以使相鄰的兩個數(shù)之間只有一位的差別...
    ericdejavu閱讀 1,617評論 0 0
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗放典。 張土汪:刷leetcod...
    土汪閱讀 12,738評論 0 33
  • Log4j簡介 通過使用Log4j可以看到程序運行過程中更詳細的信息經(jīng)常在系統(tǒng)之使用Log4j查看日志 使用方法 ...
    JIN520閱讀 235評論 0 1
  • 小米一直以“發(fā)燒”為品牌方向,為青少年提出智能手機解決方案。 同時弥臼,一系列智能家居產(chǎn)品的推出無不顯示了小米的運營策...
    耿彪閱讀 183評論 0 1
  • 文/一尺素 不知怎么的醋火,又點開了這部電影《從你的全世界路過》悠汽。有人說它是爛片,全程無看點芥驳,也有人僅僅一句臺詞戳中了...
    清檸學(xué)姐閱讀 459評論 4 10