首先我們知道一件事,就是如果這個圖上的點>1時,一定有一種連通圖是隻有1個連通塊的,而它的補圖可以有≤n個連通塊。
而且當n==2&&n==3的時候,不能出現兩個圖都是隻有1個連通塊的情況。
因爲如果這個圖不只有一個連通塊,那麼它的補圖就會把一個連通塊的點和所有其他連通塊的所有點都連上,
這樣一定只有一個聯通塊。
當a和b都等於1的時候要特殊注意,這個時候一條鏈就可以滿足條件。
其餘的,設有x個連通塊,只要讓x-1個點自己爲一個連通塊,其餘的全聯通就可以。
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int n,a,b,flag;
int main()
{
scanf("%d%d%d",&n,&a,&b);
if(a!=1&&b!=1||a==1&&b==1&&n<=3&&n>=2||a>n||b>n)
{
printf("NO");
return 0;
}
printf("YES\n");
if(a==1&&b==1)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)printf("0");
else if(j==i-1||j==i+1)
{
printf("1");
}else
{
printf("0");
}
}
printf("\n");
}
}else
{
if(a==1&&b!=1)swap(a,b),flag=1;
for(int i=1;i<=a-1;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)printf("0");
else
{
if(flag)printf("1");
else printf("0");
}
}
printf("\n");
}
for(int i=a;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)printf("0");
else if(j>=a)
{
if(flag)printf("0");
else printf("1");
}else
{
if(flag)printf("1");
else printf("0");
}
}
printf("\n");
}
}
return 0;
}