题目大意:给出矩阵的主对角线元素,使得每个元素在主对角线下的区域进行延伸(比如元素为x,则该区域有 x 个 x 连通)。问是否有这样的区域,有则输出,没有则输出-1。
思路:首先,一定是有符合题目条件的区域的,因为一共有元素个。所以现在只需进行构造,可以发现,从第一个元素开始,尽可能向左进行延伸,如果不能延伸就向下进行延伸是可以构造出符合题目条件的区域。要不然就是尽可能向下延伸,不能向下的话就向左进行延伸。确保每一个位置都不会被落下。
一开始用贪心写,写着写着发现每个位置是要不断更新的,我是菜逼。
用dfs就能很快实现啦!(~)
AC:
#include<stdio.h>
int n;
int a[505][505];
int c[505];
void dfs(int x,int y,int k)
{
if(c[k]<1) return ;
if(!a[x][y-1] && y-1>=1) //向左延伸
{
a[x][y-1]=a[k][k];
c[k]--;
dfs(x,y-1,k);
}
else if(!a[x+1][y] && x+1<=n)//向右延伸
{
a[x+1][y]=a[k][k];
c[k]--;
dfs(x+1,y,k);
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i][i]);
c[i]=a[i][i]-1;//剩余个数;
}
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++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
才发现同一份代码用不同的语言交,时间是不一样的吼,,,
Σ(っ °Д °;)っ C选手枯了。。