Contest 2050 and Codeforces Round #718 (Div. 1 + Div. 2)
C. Fillomino 2
题目大意:有一个n*n的方阵,给你n个大小为1~n的数问能不能构建一个下三角矩阵时期大小相同的数是联通的,且每种数的个数等于这个数的大小,如果可以就输出构建的下三角矩阵,不能就输出-1(通过证明一定可以,所以这种情况实际不存在)
思路:贪心策略,只要能向左就向左,不能就向下,进行模拟之后就一定能构造出来。
代码:
#include <iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
typedef long long ll;
const int N=505;
using namespace std;
bool vit[N][N];
int arr[N][N];
int main()
{
int n,t,x,y,flag=1;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%d",&arr[i][i]);
vit[i][i]=true;
}
for(int i=0; i<n; i++)
{
x=i,y=i,t=arr[i][i];
for(int j=1; j<t; j++)
{
if(y-1>=0&&!vit[x][y-1])
y=y-1;
else if(x+1<=n&&!vit[x+1][y])
x=x+1;
else
{
flag=0;
break;
}
arr[x][y]=t;
vit[x][y]=1;
}
if(flag==0)
break;
}
if(flag==0)
printf("-1\n");
else
{
for(int i=0; i<n; i++)
{
for(int j=0; j<=i; j++)
{
printf("%d%c",arr[i][j],j==i?'\n':' ');
}
}
}
return 0;
}
补一个dfs的
#include <iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#define _for(i,a,b) for(int i=(a);i<(b);i++)
#define _rep(i,a,b) for(int i=(a);i<=(b);i++)
using namespace std;
typedef long long ll;
const int N=505;
int arr[N][N]={0},cnt,n;
void dfs(int x,int y,int t)
{
if(cnt==t)
return;
arr[x][y]=t;
cnt++;
if(y-1>=0&&!arr[x][y-1])
dfs(x,y-1,t);
if(x+1<=n&&!arr[x+1][y])
dfs(x+1,y,t);
}
int main()
{
scanf("%d",&n);
_for(i,0,n)
{
scanf("%d",&arr[i][i]);
}
_for(i,0,n)
{
cnt=0;
dfs(i,i,arr[i][i]);
}
_for(i,0,n)
{
_rep(j,0,i)
{
printf("%d%c",arr[i][j],j==i?'\n':' ');
}
}
return 0;
}