C. Fillomino 2
题目大意
给你一个数n,表示一个n*n的矩阵,然后输入对角线上的元素,问你能否建立一个只有主对角线以下元素的矩阵输出,每个相同元素必须连通,每个元素的个数必须等于该元素值的大小
思路
这样的矩阵一定是存在的,因为元素个数和矩阵的能容纳的元素相等,那么如何构建呢,每次主对角线上元素开始,能往左构建尽量往左构建,当到了左边界时,然后一直向下面构建,当到到达底部时,就一直向有右构建,这样构建是最优的,因为这个对角线上的元素最低可能的影响下一个对角线上的元素。
通过代码
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimization ("unroll-loops")
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define sl(n) scanf("%lld",&n)
#define pl(n) printf("%lld",n)
#define sdf(n) scanf("%lf",&n)
#define pdf(n) printf("%.lf",n)
#define pE printf("\n")
#define ull unsigned long long
#define pb push_back
#define debug(a) cout<<a<<"??"
#define me(a) memset(a,0,sizeof(a))
#define pre(n) for(ll i=1;i<=n;i++)
#define rep(n) for(ll i=n;i>=1;i--)
#define ph push
#define pi pair<ll,ll>
#define fi first
#define se second
const ll mod = 1e9+7;
ll a[600][600];
ll b[600][600];
ll n;
void dfs(ll x,ll y,ll k){
if(b[k][k]<=1)return ;
if(y-1>=1&&!a[x][y-1]){
a[x][y-1]=a[k][k];
b[k][k]--;
dfs(x,y-1,k);
}
else if(x+1<=n&&!a[x+1][y]){
a[x+1][y]=a[k][k];
b[k][k]--;
dfs(x+1,y,k);
}
else {
b[k][k]--;
a[x][y+1]=a[k][k];
dfs(x,y+1,k);
}
}
int main()
{
sl(n);
for(int i=1;i<=n;i++)sl(a[i][i]),b[i][i]=a[i][i];
for(int i=1;i<=n;i++)dfs(i,i,i);
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
cout<<a[i][j]<<' ';
}
puts("");
}
return 0;
}