• 回形矩阵


    问题描述:对于任意一个大于等于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
  • 相关阅读:
    点击鼠标获得坐标位置
    广告的字一个一个的显示出来
    纯css实现下拉菜单的效果
    用css3写出的倒三角形
    MySQL(三)
    Navicat之MySQL连接(二)
    MySQL 的安装与使用(一)
    Servlet(二)
    Servlet(一)
    Linux常用命令大全
  • 原文地址:https://www.cnblogs.com/wendcn/p/10403111.html
Copyright © 2020-2023  润新知