C語言複習---輸出魔方陣

來源:互聯網
上載者:User

標籤:部分   bre   數字   圖片   size   array   for   輸出   time   

一:奇魔方陣演算法:
1.第一個元素放在第一行中間一列
2.下一個元素存放在當前元素的上一行、下一列。
3.如果上一行、下一列已經有內容,則下一個元素的存放位置為當前列的下一行。
在找上一行、下一行或者下一列的時候,必須把這個矩陣看成是迴繞的。
演算法實現:
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>#include <math.h>#define MAXSIZE 100int main(){    //輸出魔方陣    int n,i,j;    int row, col;    int lrow, lcol;    //儲存上一步資料,用於還原    int a[MAXSIZE][MAXSIZE] = { 0 };    while (1)    {        printf("print a odd number:(3-99)");        scanf("%d", &n);        if (n % 2)            break;    }        row = 0;    col = (n - 1) / 2;      a[row][col] = 1;    for (i = 2; i <= n*n; i++)    {        row--;        col++;        if (row < 0)            row = n - 1;        if (col >= n)            col = 0;        if (a[row][col])    //若是上一行下一列處有資料了,我們就要將下標還原,行數加一        {            row = lrow + 1;            col = lcol;            if (row >= n)                row = 0;        }                lcol = col;        lrow = row;        a[row][col] = i;    }    for (i = 0; i < n; i++)    {        for (j = 0; j < n; j++)            printf("%5d", a[i][j]);        printf("\n");    }    system("pause");    return 0;}

二:階數n = 4 * m(m =1,2,3……)的偶魔方的規律如下:
按數字從小到大,即1,2,3……n2順序對魔方陣從左至右,從上到下進行填充;將魔方陣分成若干個4×4子方陣,將子方陣對角線上的元素取出;將取出的元素按從大到小的順序依次填充到n×n方陣的空缺處。
演算法實現:
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>#include <math.h>#define MAXSIZE 100int main(){    //輸出魔方陣    int n,i,j;    int row, col;    int a[MAXSIZE][MAXSIZE] = { 0 };    int tempArray[MAXSIZE*MAXSIZE / 2] = { 0 };    //用於存放各個子方陣的主對角線    while (1)    {        printf("print a even number:(4-100)");        scanf("%d", &n);        if (n % 4==0)            break;    }        //步驟一:將資料按順序填充    i = 1;    for (row = 0; row < n; row++)        for (col = 0; col < n; col++)            a[row][col] = i++;    //步驟二:將資料全部分為4X4子方陣,取出其中的主對角線,按照大小排序。注意:這裡擷取的資料已經是從小到大了    i = 0;    for (row = 0; row < n; row++)    {        for (col = 0; col < n; col++)        {            if ((col % 4 == row % 4) || ((col % 4 + row % 4) == 3))            {                tempArray[i] = a[row][col];                i++;            }        }    }    //步驟三:將資料從大到小放入之前的子方陣對角線上    i--;    for (row = 0; row < n; row++)    {        for (col = 0; col < n; col++)        {            if ((col % 4 == row % 4) || ((col % 4 + row % 4) == 3))            {                a[row][col] = tempArray[i];                i--;            }        }    }    //步驟四:輸出魔方陣    for (i = 0; i < n; i++)    {        for (j = 0; j < n; j++)            printf("%5d", a[i][j]);        printf("\n");    }    system("pause");    return 0;}
三:階數n = 4 * m + 2(m =1,2,3……)的魔方(單偶魔方)
將魔方分成A、B、C、D四個k階方陣,這四個方陣都為奇方陣,利用上面講到的方法依次將A、D、B、C填充為奇魔方。交換A、C魔方元素,對魔方的中間行,交換從中間列向右的m列各對應元素;對其他行,交換從左向右m列各對應元素。交換B、D魔方元素,交換從中間列向左m – 1列各對應元素。
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>#include <math.h>#define MAXSIZE 6int main(){    //輸出魔方陣    int n, i, j, k,temp;    int row, col;    int lrow, lcol;    int a[MAXSIZE][MAXSIZE] = { 0 };        while (1)    {        printf("print a even number:4*m+2<m=1,2,...>");        scanf("%d", &n);        if (n % 4 == 2)            break;    }    //步驟一:構建四個子方陣ADBC    //先構建A,然後對A進行每個元素加即可得到所有的子方陣    k = n / 2;    row = 0;    col = (k - 1) / 2;    a[row][col] = 1;    for (i = 2; i <= k*k;i++)    {        row--;        col++;        if (row < 0)            row = k - 1;        if (col >= k)            col = 0;        if (a[row][col])        {            row = lrow + 1;            col = lcol;            if (row >= k)                row = 0;        }        lcol = col;        lrow = row;        a[row][col] = i;    }    //按照順序構建DBC方陣    for (row = 0; row < k;row++)    {        for (col = 0; col < k;col++)        {            a[row + k][col + k] = a[row][col] + k*k;    //D子方陣            a[row][col + k] = a[row][col] + 2*k*k;    //B子方陣            a[row + k][col] = a[row][col] + 3*k*k;    //C子方陣        }    }        //步驟二:交換AC子方陣的資料    //1.先交換中間行的右半部分的m列,N=2*(2*m+1),k=2*m+1,m=(k-1)/2,所以這裡的m是不包含最後一列的,包含中間列    //2.對於其他行,將會每行的前半部分    for (row = 0; row < k;row++)    {        if (row == k / 2)    //中間行        {            for (col = k / 2; col < k - 1; col++)            {                temp = a[row][col];                a[row][col] = a[row + k][col];                a[row + k][col] = temp;            }        }        else   //其他行,交換前m列,不包含中間列        {            for (col = 0; col < k / 2;col++)            {                temp = a[row][col];                a[row][col] = a[row + k][col];                a[row + k][col] = temp;            }        }    }    //步驟三:交換BD子方陣,交換中間列向左m-1列    for (row = 0; row < k;row++)    {        for (i = 0; i < (k - 1) / 2 - 1; i++)        {            temp = a[row][k + k / 2 - i];            a[row][k + k / 2 - i] = a[row + k][k + k / 2 - i];            a[row + k][k + k / 2 - i] = temp;        }    }    //步驟四:輸出魔方陣    for (i = 0; i < n; i++)    {        for (j = 0; j < n; j++)            printf("%5d", a[i][j]);        printf("\n");    }    system("pause");    return 0;}

 

C語言複習---輸出魔方陣

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.