平方矩阵问题

发布于:2025-03-17 ⋅ 阅读:(22) ⋅ 点赞:(0)

回字形二维数组

#include <iostream>
#include <iomanip>
using namespace std;
int main(){
    int n;
    while(cin>>n,n){
        for(int i=0; i<n;i++){
            for(int j=0; j<n; j++){
                int up=i, down=n-i+1, left=j, right=n-j+1;
                cout<<min(min(up,down),min(left,right))<<' ';
                
            }
            cout<<endl;
        }
        cout<<endl;
    }
    return 0;
}

在这个程序中,每个位置 ( 𝑖 , 𝑗 )需要填充一个数,该数的计算方式是取该位置到四条边的最短距离。
在这里插入图片描述

二维数组

#include <iostream>
using namespace std;
int a[100][100];
int main(){
    int n;
    while(cin>>n,n){
        for(int i=0; i<n; i++){
            //填充对角线
            a[i][j]==1;
            //填充上三角
            for(int j=i+1, k=2; j<n; j++, k++){
                //行不变列变
                a[i][j]=k;
            }
            //填充下三角
            for(int j=i+1, k=2; j<n; j++,k++){
                //行变列不变
                a[j][i]=k;
            }
        }
        
        //输出
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                cout<<a[i][j]<<endl;
            }
            cout<<endl;
        }
        cout<<endl;
    }
    return 0;
}

上三角填充分析
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
//下三角填充分析
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2的 i + j 次方

#include <iostream>
using namespace std;
int main(){
    int n;
    while(cin>>n, n){
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                int v=1;
                //2的n次方等于n个2相乘
                for(int k=0; k<i+j; k++){
                    v*=2;
                }
                cout<<v<<' ';
            }
            cout<<endl;
        }
        cout<<endl;
    }
    return 0;
}

蛇形矩阵

#include <iostream>
using namespace std;
int res[100][100];
int main(){
    int n,m;
    cin>>n>>m;
    //定义方向数组
    //控制行变动
    int dx[]={0,1,0,-1}
    //控制列变动
    int dy[]={1,0,-1,0};
    
    //x = 0, y = 0:起始位置在矩阵的左上角 (0,0)
    //d = 0:初始方向向右
    //k = 1:从 1 开始填充到 n*m,一共 n*m 次
    
    for(int x=0, y=0, d=0, k=1; k<=n*m; k++){
        
        res[x][y] = k;
        
        //计算当前方向的下一个坐标 (a, b)
        int a=x+dx[d] , b=y+dy[d];
        
        //判断是否 超出矩阵边界 (a < 0, a >= n, b < 0, b >= m)。
        //判断是否 已经填充过 (res[a][b] 非零)。
        if(a<0 || a>=n || b<0 || b>=m || res[a][b]){
            //(d + 1) % 4 保证 d 在 0~3 之间循环
            d=(d+1)%4;
            
            如果无法前进,则顺时针换方向 (d+1),再计算新方向的 (a, b)
            a=x+dx[d],b=y+dy[d];
        }
        //更新 x, y 为新的位置。
        x=a, y=b;
    }
    
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            cout<<res[i][j]<<' ';
        }
        cout<<endl;
    }
    return 0;
}

在这里插入图片描述
在这里插入图片描述