演算法題目 大轉盤

2021-08-26 05:46:08 字數 2112 閱讀 4870

問題描述

鄧老師有乙個大轉盤,被平分成了 2^n 份。

鄧老師還有乙個長度為 2^n 的陣列 a(下標從 0 開始),其中的每個元素都是 0 或 1。於是鄧老師就可以選擇大轉盤上的乙個位置,將 a[0] 填入其中,然後按順時針順序依次將 a[1],a[2],…,a[2^n-1] 填入。

對於大轉盤上的乙個指定位置,鄧老師可以從它開始,取出順時針方向的 n 個位置,並將它們按原順序拼接起來,得到乙個長度為 n 的 01 串,也就是乙個 n 位二進位制數。我們把這個二進位制數稱作從這個位置開始的幸運數。

顯然地,大轉盤上共有 2^n 個位置可以獲得幸運數,而巧合的是 n 位二進位制數恰好也有 2^n 個,所以鄧老師希望這些所有的幸運數包含了所有的 n 位二進位制數。

請輸出乙個陣列 a,使其滿足鄧老師的要求。(如果有多解,輸出任一即可)

簡要題意

給定整數n(1<= n <=16),有乙個切成了2^n塊的圓盤,每塊有乙個數字0或1.從第i個格仔出發,順時針走過n個格仔,依次讀出n個數字形成乙個二進位制數ai。

下面是乙個 n=3 的例子。

一行乙個整數 n。

輸出一行 2^n 個字元,第 i 個字元(1<=i<=2^n)表示 a[i-1]。

3
如果把所有 n-1 位二進位制數建立節點,將所有的 n 位二進位制數視為單向邊。對於邊 x,設其前 n-1 位為 u,後 n-1 位為 v,則其連線 u,v,在這張圖上求出尤拉迴路

借助此圖

此圖為n是4的情況,將所有的四位二進位制數當作邊,每條邊的終點分別對應了另外兩條邊,這兩條邊均是這條邊抹掉最高位,最低位加上0或者1形成的。每次這種變化,我們就在尾部加上0或者1.直至不重複的遍歷完這張圖的所有邊

**:

#include #include using namespace std;

// ***************== **實現開始 ***************==

// allone:全1的二進位制數,用於二進位制「與運算」,allone = 2^(n-1) - 1

//vis: vis[i][u]表示從u出發,值為i的邊

//ans:答案

int allone;

vectorvis[2];

string ans;

//計算2^x

//x:指數

//返回值:2^x

int twopow(int x)

//求尤拉迴路

//u:當前所有節點

void dfs(int u)

}}/* 請在這裡定義你需要的全域性變數 */

// 本函式求解大轉盤上的數,你需要把大轉盤上的數按順時針順序返回

// n:對應轉盤大小,意義與題目描述一致,具體見題目描述。

// 返回值:將大轉盤上的數按順時針順序放到乙個string中並返回

string getanswer(int n)

dfs(0);

return ans;

}// ***************== **實現結束 ***************==

int main()

注意**

ans.push_back('0' + i);為何是在dfs()遞迴呼叫之後呢?

看圖

紅色線的是從000結點出發,一直走到遞迴到不能再遞迴的路線。開始不斷返回上層遞迴,直到有新路可走(綠色線),如果

ans.push_back('0' + i);和dfs(v)調換位置,這兩條線就無法通過結點鏈結了。

就像下圖一樣,這樣做以後,變成了右圖,可以一筆畫下去

大轉盤遊戲

public class su ceviewtemp extends su ceview implements callback,runnable 顯示的文字 private int mimg new int private bitmap mg private int mcolor new int ...

大轉盤的實現

header content type text html charset utf 8 date default timezone set prc 如果上面兩行不存在對應問題,可以不設定 儲存轉盤資訊及提前設定的中獎者使用者 prize arr array array min 1,max 89,pr...

大轉盤備忘錄

function get rand proarr else unset proarr return result 設定獎品 prize arr array 0 array id 1,prize 平板電腦 v 1 1 array id 2,prize 數位相機 v 5 2 array id 3,pri...