導航:首頁 > 源碼編譯 > n階魔方復原演算法

n階魔方復原演算法

發布時間:2022-06-21 23:03:50

『壹』 求還原魔方的方法

你可以到魔方小站去學習,那裡有
視頻有圖解,學會了以後很快就能
還原魔方了。
第一面你可以自己探索,第二層我
教你個口訣,遠切回回接孩子放學。
復原頂面我給你個公式,F R U R' U'.
還有一個小魚的。

小魚:
左下90,上順90,左上90,上順90,左下90,
上順180,左上90,注意魚頭在自己左上角,魚二魚頭在
右上角,公式和魚一一樣。

還有一個反面l字的公式
反面L字:頂層那一面對著自己右上180度,
下逆180度,右下90度,上逆90度,右上90
度,下逆180度,右下90度,上順90度右下90
度。

復原魔方就是那麼簡單容易,希望
你早日學會。

『貳』 魔方的計算公式是什麼

魔方的計算公式是還原公式方法如下:

1、底棱歸位,又稱之為 Cross,英文的意思是十字還原,選擇白色面做底面,在魔方的底層架十字。還原棱就是在每一個面上都拼出個十字,拼十字時不是按面來的,而是按層來的。先還第一層的,也就是在第一面上拼出個十字。

『叄』 魔方的演算法是怎麼計算出來的

早期完全是人腦思考,現在是有電腦解法了。
人腦解法就是先劃分局部目標,利用抵消和循環動作不破壞已經拼好的部分,然後逐步完成全部。在嘗試中積累到更多經驗的時候,就可以逐漸減少局部目標的數量,同時難度也提高了,不過總步數卻減少了。減少步數就是最終方向了,它說明了思考更具全局性。
我無法預測人腦最後能不能進化成完全立足全局進行思考,但我知道那很遙遠,因為人們太不注重優生了,總是隨便湊一對解決性飢渴就行了,然後就一輩子捆上了。
我不知道別人是在什麼樣的狀態下解出魔方,我是在快樂的忘我狀態下解魔方的,也許是「入定」也許不是,培養起持續思考的能力的人應該各有各的狀態吧。我是沿襲了解殘棋時養成的習慣,思考時有腦內按摩的快感。不過現在快感的閾值總在提高,殘棋早已沒有快感了。
我嘗試了用自己所能想出的所有順序去拼魔方,也就是進行各種不同的局部目標劃分,因此可能積累的經驗要比多數人稍多一點,不過這一定只是解法中微小到無限的部分。我不確定解法無限,但確定再高的智商也一生研究不完。因此,棋和魔方我都不會花一生時間沉醉其中,適當用來娛樂就行了。
提一下中心塊吧,6塊相對位置是不變的,但有原地轉的自由。因此6色魔方和拼圖魔方是有些不同,6面帶圖案的是真復原,6色的通常由人腦來處理就不是真復原。3階魔方解法也就這兩類,各種還原順序都不能算類,包括一些蒙眼小丑的表演都不能算類。
不多說了,最後糾正一下你的認識。一般人就可以解魔方,只要培養起思考方法。

『肆』 魔方的演算法是怎麼計算出來的

有些公式是由資深魔方玩家研究出來的,另外有些高階魔方(如4階,5階)的翻正一個棱塊組,及翻各種花樣那樣長的公式是結合電腦計算出來的,一般人恐怕很難做到.公式不斷在是進化的,方法也是不斷在更新的,目前主流還原魔方方法是層先法,它的公式少,步驟多,一般人都能夠按照該法復原.

『伍』 求一個n階魔方陣的演算法!希望能用標准c++的風格來做!

#define sizem ((size / 2 - 1) / 2)
#define sizeh (size / 2)
#define sizesq (sizeh * sizeh)

void main()
{
int size = 0; //幻方大小
int x = 0, y = 0; //下一個數字所放的位置
int i, j; //循環變數
int st_i, st_x = 0, st_y = 0;
int currnum; //構造雙偶數階幻方填數的變數
int temp;

//-----輸入幻方大小-------------------------------
while ((size < 1) || (size > 31) || (size == 2))
{
printf("size of magic square:");
scanf("%d", &size);
}

//-----建立二維動態數組---------------------------
int **a = new int *[size];
for (i=0; i<size; i++)
{
a[i] = new int [size];
}

if (size % 2 == 1)
{
//-----構造奇數階(2n+1)幻方(連續擺數法)---
x = (size + 1) / 2 - 1; //第一個數字在第一行
y = 0; //的正中間位置

//-----開始填數-------------------------------
for (i=1; i<=size*size; i++)
{
a[y][x] = i;

//-----分析下一個數字的位置---------------
//-----當下一個數是size的倍數時,放在正下方
if (i % size == 0)
{
y++;
}
//-----當超出上面的邊界時-----------------
else if (y == 0)
{
x++;
y = size - 1;
}
//-----當超出右面的邊界時-----------------
else if (x == size - 1)
{
x = 0;
y--;
}
//-----正常情況下-------------------------
else
{
x++;
y--;
}
}
}
else if (size % 4 == 0)
{
//-----構造雙偶數階(4n)型幻方(對稱法)-----
//-----第一步:分區並給分區做標記-------------
for (x=0; x<size/2; x++)
{
for (y=0; y<size/2; y++)
{
if ((x + y) % 2 == 0)
{
a[x][y] = -1;
a[x][size-y-1] = -1;
a[size-x-1][y] = -1;
a[size-x-1][size-y-1] = -1;
}
}
}
//-----第二步:填數-------------------------
for (x=0; x<size; x++)
{
for (y=0; y<size; y++)
{
currnum = x * size + y;
if (a[x][y] == -1)
{
a[x][y] = size * size - currnum;
}
else
{
a[x][y] = currnum + 1;
}
}
}
}
else
{
//-----構造單偶數階(2(2m+1))幻方(斯特雷奇法)
//-----第一步:構造size/2階幻方(連續擺數法)-
for (st_i=0; st_i<4; st_i++)
{
switch (st_i)
{
case 0:
st_x = 0;
st_y = 0;
break;
case 1:
st_x = sizeh;
st_y = sizeh;
break;
case 2:
st_x = sizeh;
st_y = 0;
break;
case 3:
st_x = 0;
st_y = sizeh;
break;
default:
break;
}
x = (sizeh + 1) / 2 - 1; //第一個數字在第一行
y = 0; //的正中間位置

//-----開始填數---------------------------
for (i=1; i<=sizesq; i++)
{
a[y+st_y][x+st_x] = i + sizesq * st_i;

//-----分析下一個數字的位置---------------
//-----當下一個數是size的倍數時,放在正下方
if (i % (size / 2) == 0)
{
y++;
}
//-----當超出上面的邊界時-----------------
else if (y == 0)
{
x++;
y = size / 2 - 1;
}
//-----當超出右面的邊界時-----------------
else if (x == size / 2 - 1)
{
x = 0;
y--;
}
//-----正常情況下-------------------------
else
{
x++;
y--;
}
}//-----end of for(i)---------------------
}//-----end of for(st_i)

//-----第二步:交換A和D的第二行起m個數字------
for (j=1; j<sizem+1; j++)
{
temp = a[(sizeh+1)/2-1][j];
a[(sizeh+1)/2-1][j] = a[(sizeh+1)/2+sizeh-1][j];
a[(sizeh+1)/2+sizeh-1][j] = temp;
}

//-----第三步:交換A和D其它行的數字-----------
for (i=0; i<sizeh; i++)
{
if (i == (sizeh + 1) / 2 - 1)
{
continue;
}
for (j=0; j<sizem; j++)
{
temp = a[i][j];
a[i][j] = a[sizeh+i][j];
a[sizeh+i][j] = temp;
}
}

//-----第四步:交換C和B最後m-1行的數字
for (i=0; i<sizeh; i++)
{
for (j=size-1; j>size-sizem; j--)
{
temp = a[i][j];
a[i][j] = a[sizeh+i][j];
a[sizeh+i][j] = temp;
}
}
}//-----end of if(size % 2 == 0)

//-----輸出幻方-----------------------------------
cout<<endl;
for (i=0; i<size; i++)
{
for (j=0; j<size; j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl<<endl;
}
cout<<endl;

//-----清除數組-------------------------------
for (i=0; i<size; i++)
{
delete [] a[i];
}
delete [] a;

}

『陸』 n階魔方復原有什麼規律

高級魔方復原都是有規律的,比如三階以上
高價魔方雙數的就是用四階魔方復原,而但
數的是用五階魔方復原而且步驟幾乎是相同的。

『柒』 求一個n階魔方陣的演算法用標准c語言的風格來做的

對平面魔方的構造,分為三種情況:N為奇數、N為4的倍數、N為其它偶數(4n+2的形式)
⑴ N 為奇數時,最簡單
(1) 將1放在第一行中間一列;
(2) 從2開始直到n×n止各數依次按下列規則存放:
按 45°方向行走,如向右上
每一個數存放的行比前一個數的行數減1,列數加1
(3) 如果行列范圍超出矩陣范圍,則回繞。
例如1在第1行,則2應放在最下一行,列數同樣加1;
(4) 如果按上面規則確定的位置上已有數,或上一個數是第1行第n列時,
則把下一個數放在上一個數的下面。
⑵ N為4的倍數時
採用對稱元素交換法。
首先把數1到n×n按從上至下,從左到右順序填入矩陣
然後將方陣的所有4×4子方陣中的兩對角線上位置的數關於方陣中心作對
稱交換,即a(i,j)與a(n+1-i,n+1-j)交換,所有其它位置上的數不變。
(或者將對角線不變,其它位置對稱交換也可)
⑶ N 為其它偶數時
當n為非4倍數的偶數(即4n+2形)時:首先把大方陣分解為4個奇數(2m+1階)子方陣。
按上述奇數階魔方給分解的4個子方陣對應賦值
上左子陣最小(i),下右子陣次小(i+v),下左子陣最大(i+3v),上右子陣次大(i+2v)
即4個子方陣對應元素相差v,其中v=n*n/4
四個子矩陣由小到大排列方式為 ① ③
④ ②
然後作相應的元素交換:a(i,j)與a(i+u,j)在同一列做對應交換(j<t或j>n-t+2),
a(t-1,0)與a(t+u-1,0);a(t-1,t-1)與a(t+u-1,t-1)兩對元素交換
其中u=n/2,t=(n+2)/4 上述交換使每行每列與兩對角線上元素之和相等。

snjsj 我的程序演算法:
這個魔方陣的演算法可以對除2以外的任意階數的方陣進行輸出,結果保存在運行程序的目錄下面的Magic.txt文件中,用ie或者寫字板打開以保持格式的一致(主要是回車符在記事本中為黑方框,認不出來)。當然具體的程序中,有內存空間以及變數范圍的約束,我試過了,100以內的是可以的。
偶數階的演算法都是建立在奇數階的基礎之上,設方陣的階數為n,則魔方陣常數(即每列每行以及對角線元素之和)為n*(n*n+1)/2。

請對照程序代碼看,否則可能看不懂,可以一邊看一邊用筆對小階的進行演算。

先說奇數階的演算法,這是最容易的演算法:
n=2*m+1,m為自然數
1)將數字1填在(0,(n+1)/2) ;要注意c中是從下標0開始
2)從左上往右下依次填。
3)由2),列的下標出界(超過n-1)時,行加1,以n為摸的余數為應填的列數;
4)由2),行的下標出界(超過n-1)時,列加1,以n為摸的余數為應填的行數;
5)由2),行列都未出界,但已添上其他數,應在當前位置左橫移一個位置進行填數。

然後是偶數階:
分兩種情況,一種是n%4==2,一種是n%4==0
前一種:n=2*(2*m+1),m為自然數
1)將n階方陣分為四個小魔方陣ABCD如下排列:

B C
D A

因為n*n=4*(2*m+1)*(2*m+1),
記u=n/2=2*m+1,分為1~u*u,u*u+1~2*u*u,2*u*u+1~3*u*u,3*u*u+1~4*u*u
即在調用子函數的時候分別如下面傳遞參數:
A(0),B(u*u),C(2*u*u),D(3*u*u)
分別在ABCD中按照前面的填法把奇數階填好(注意加上所傳參數作為基數,每一個元素都要加上這個值),最後做如下交換:
(1)B中第0~(m-1)-1行中元素與C中相對應元素交換
(2)D中第(n-1)-m+1~(n-1)共m行的每行中的元素與A中相對應元素交換
(3)交換D:(u+m,m)與A中對應元素(矩陣中心值)
(4)交換D:(n-1,m)與A中對應元素(實際為矩陣最大值n*n)

所謂對應位置,指相對於小魔方陣的左頂角的相對的行列位置
上面的這些你可以用數學進行證明,利用魔方陣常數(注意n階的和u階的關系)

後一種:n=4*m,m為自然數
因為行列都是4的倍數,因而可以將整個矩陣分為每4*4的小矩陣。
先判斷一個數是否在劃為4*4小矩陣的對角線上,
如果在,則填該位置的數為n*n-i+1(i為該元素的相對位置,從1開始,比如n階的第s行第t個元素則其i=s*n+t)
如果不在,則填上i。

閱讀全文

與n階魔方復原演算法相關的資料

熱點內容
華為安卓手機編譯器 瀏覽:46
怎樣在打開微信前加密 瀏覽:664
旺旺聊天記錄怎麼加密 瀏覽:411
王安憶長恨歌pdf 瀏覽:619
mobile文件夾可以卸載嗎 瀏覽:280
什麼是2通道伺服器 瀏覽:346
mc正版怎麼開伺服器地址 瀏覽:408
樂高解壓朋友圈 瀏覽:14
linux軟raid性能 瀏覽:368
貼片機編程軟體下載 瀏覽:360
mooc大學樂學python答案 瀏覽:408
怎麼投訴途虎app 瀏覽:37
安卓重力感應怎麼關 瀏覽:720
我的世界ios怎麼建伺服器地址 瀏覽:759
伺服器埠ip都是什麼意思 瀏覽:263
華為主題軟體app怎麼下 瀏覽:840
我們的圖片能夠收藏加密嗎 瀏覽:979
mysql空值命令 瀏覽:213
python整點秒殺 瀏覽:885
怎麼樣互傳app 瀏覽:293