1105 Spiral Matrix (25 分)

考察点:试除法求约数、方向数组。

类似题:756. 蛇形矩阵

const int N=10010;
int a[N];
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
int k,n,m;
int cnt;

bool check(int x,int y)
{
    return x>=0 && x<n && y>=0 && y<m;
}

void dfs(int x,int y,int dir,vector<vector<int>> &res)
{
    res[x][y]=a[cnt++];

    int a=x+dx[dir],b=y+dy[dir];
    if(!check(a,b) || res[a][b])
    {
        dir=(dir+1)%4;
        a=x+dx[dir],b=y+dy[dir];
    }

    if(check(a,b) && !res[a][b])
        dfs(a,b,dir,res);
}

int main()
{
    cin>>k;
    for(int i=0;i<k;i++) cin>>a[i];
    sort(a,a+k,greater<int>());

    for(int i=1;i*i<=k;i++)
        if(k % i == 0)
        {
            m=i;
            n=k/i;
        }

    vector<vector<int>> res(n,vector<int>(m));
    dfs(0,0,0,res);

    for(int i=0;i<res.size();i++)
    {
        for(int j=0;j<res[i].size();j++)
            if(j) cout<<' '<<res[i][j];
            else cout<<res[i][j];
        cout<<endl;
    }
    //system("pause");
    return 0;
}
posted @ 2021-03-06 17:27  Dazzling!  阅读(54)  评论(0编辑  收藏  举报