这是一道可图问题每一次循环的时候都要SORT一次。。。寒假集训的时候也有一道类似的题,不过数据太水,一次sort都不要就可以过。。。。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct point
{
int l,num;
};
point len[105];
int ans[15][15];
bool cmp(point a,point b)
{
return a.l>b.l;
}
int main()
{
int t,n,yes;
scanf("%d",&t);
while(t--)
{
yes=1;
scanf("%d",&n);
memset(ans,0,sizeof(ans));//初始化,这个也很重要。。。。
memset(len,0,sizeof(len));
for(int i=1;i<=n;i++)
{
scanf("%d",&len[i].l);
len[i].num=i;
if(len[i].l>n-1) yes=0;
}
//printf("yes");
if(yes==0)
{
printf("NO\n\n");
continue;
}
sort(len+1,len+n+1,cmp);//这个可以放到循环里面。。。
//for(int i=1;i<=n;i++) printf("%d\n",len[i].l);
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(len[i].l==0) break;
if(len[j].l==0) continue;
len[i].l--;
len[j].l--;
ans[len[i].num][len[j].num]=1;
ans[len[j].num][len[i].num]=1;
}
sort(len+i+1,len+n+1,cmp);
}
for(int i=1;i<=n;i++)
{
if(len[i].l>0)
{
yes=0;
break;
}
}
if(yes==0)
{
printf("NO\n\n");
}
else if(yes==1)
{
printf("YES\n");
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(j!=1) printf(" ");
printf("%d",ans[i][j]);
}
printf("\n");
}
printf("\n");//这个很重要,没有的话不会返回PE 直接WA;
}
}
return 0;
}