RT,求好用的方法(不包括压行),顺便贴一下刚才改了 10 分钟缩进和大括号匹配的代码(先不考虑题目、正确性、码风)
#include<iostream>
#include<cstdio>
using namespace std;
int read(){
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<1)+(x<<3)+c-'0';
c=getchar();
}
return x*f;
}
int a[305];
char mp[305][305];
int full[305];
int cnt;
int main(){
int n=read(),m=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
mp[i][j]='0';
for(int i=1;i<=m;i++)
a[i]=read();
for(int i=1;i<=m;i++){
if(a[i]>(n+1)/2){
printf("No");
return 0;
}
if(a[i]==(n+1)/2){
if(full[cnt]==i-1&&n%2!=0&&i!=1){
printf("No");
return 0;
}
cnt++;
full[cnt]=i;
if(full[cnt]==i-1&&n%2==0)
for(int j=2;j<=n;j+=2)
mp[j][i]='1';
else
for(int j=1;j<=n;j+=2)
mp[j][i]='1';
}
}
if(!cnt){
for(int j=1;j<=n;j++){
if(j%2==0)
for(int k=2;k<=a[j]*2;k+=2)
mp[k][j]='1';
else
for(int k=1;k<=a[j]*2-1;k+=2)
mp[k][j]='1';
}
}
else{
for(int i=1;i<=cnt-1;i++){
if((full[i+1]-full[i]-1)%2==1){
for(int j=1+full[i];j<=full[i+1]-1;j++){
if(j%2==0)
for(int k=2;k<=a[j]*2;k+=2)
mp[k][j]='1';
else
for(int k=1;k<=a[j]*2-1;k+=2)
mp[k][j]='1';
}
}
if(!(full[i+1]-full[i]-1)%2){
int flag=0;
for(int j=full[i]+1;j<full[i+1]-2;j++){
if(a[j+1]-a[j]<=(n+1)/2){
flag=j;
break;
}
if(!flag){
printf("No");
return 0;
}
}
int cnt=1;
for(int j=1+full[i];j<=full[i+1]-1;j++){
if(flag==j){
if(cnt%2==0){
for(int k=2;k<=a[j];k+=2)
mp[k][j]='1';
j++;
for(int k=2*a[j-1];k<=(a[j]+a[j-1])*2;k+=2)
mp[k][j]='1';
}
else{
for(int k=1;k<=a[j]*2;k+=2)
mp[k][j]='1';
j++;
for(int k=2*a[j-1]-1;k<=(a[j]+a[j-1])*2-1;k+=2)
mp[k][j]='1';
}
}
if(cnt%2==0)
for(int k=2;k<=a[j];k+=2)
mp[k][j]='1';
else
for(int k=1;k<=a[j];k+=2)
mp[k][j]='1';
}
}
}
}
printf("Yes\n");
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
printf("%c",mp[i][j]);
printf("\n");
}
return 0;
}