1. 程式人生 > >回形矩陣

回形矩陣

class span 個數 str 我們 整數 結束 for 記錄

問題描述:對於任意一個大於等於4的整數n,可得到如下一個nxn的回形數字矩陣

1 1 1 1

1 2 2 1

1 2 2 1

1 1 1 1

每一圈的數字都一樣,往內層走,數字變大。

輸入:一個整數n

輸出:一個nxn數字矩陣

求解方法:

思路一:這是一個對稱形,上下對稱,左右對稱,所以,我們只需要找到四分之一的形狀,其他的用對稱性就可以得到。我們不妨把這個回形矩陣分成左上、右上、左下、右下四個部分。

左上部分實際上是取行數和列數的最小值,所以這個問題就變得簡單了。

程序代碼如下:

技術分享圖片
#include<iostream>
using
namespace std; int a[100][100]; int main(){ int n,m; cin>>n>>m; for(int i=1;i<=(n+1)/2;i++) for(int j=1;j<=(m+1)/2;j++) { a[i][j]=i<j?i:j; a[n+1-i][j]=a[i][j]; a[i][m+1-j]=a[i][j]; a[n+1-i][m+1-j]=a[i][j]; }
for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) cout<<a[i][j]<< ; cout<<endl; } return 0; }
View Code

思路二:可以一圈一圈的賦值。每一圈的值一樣。

第一次用數字1給矩陣全部賦值後的結果如下:

1 1 1 1

1 1 1 1

1 1 1 1

1 1 1 1

然後進行第二圈用數字2賦值,起始位置從2行2列開始,結束於n-1行n-1列,結果如下:

1 1 1 1

1 2 2 1

1 2 2 1

1 1 1 1

程序代碼如下:

技術分享圖片
#include<iostream>
using namespace std;
int a[100][100]; 
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=(n+1)/2;i++)
        for(int h=i;h<=n+1-i;h++)
            for(int l=i;l<=n+1-i;l++)
                a[h][l]=i;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
            cout<<a[i][j]<< ;
        cout<<endl;
    }
    return 0;
}
View Code

思路三:可用轉圈的方式進行填充。從左上角開始向右搜索前進,遇到邊界或前方位置已經填充就向右轉向,如果轉向後的方向是向右,則填充的數字增加1,直到填充完全。這種思路在深搜裏很常見。

技術分享圖片
#include<iostream>
using namespace std;
int a[100][100];
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
int main(){
    int n,x=1,y=1,i=1,j=0,z=1;
    //(x,y)記錄當前位置,i記錄己寫數字個數,j代表方向(j=0則值加1),z代表值 
    cin>>n;
    while(i++<=n*n)
    {
        a[x][y]=z;
        if(a[x+dx[j]][y+dy[j]]||x+dx[j]>n||y+dy[j]<1||y+dy[j]>n)
        {
            j++;
            if(j==4)j=0,z++;            
        }
        x+=dx[j],y+=dy[j]; 
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
            cout<<a[i][j]<< ;
        cout<<endl;
    }
    return 0;
}
View Code

回形矩陣