直接暴力求出所有的坐标然后输出,记住每行的长度是固定的,是最长的那一行,也就是输出的个数,不够的行要用空格补齐
AC代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
struct Point{
int x, y;
int statu;
bool operator<( const Point &b )const{
if( y != b.y ){
return y > b.y;
}else{
return x < b.x;
}
}
};
Point point[1100000];
int cnt;
int a[1100], N;
int main(){
while( scanf( "%d", &N ) != EOF ){
for( int i = 0; i < N; i++ ){
scanf( "%d", &a[i] );
}
int nowx, nowy, nowt;
nowx = nowy = 0;
nowt = -1;
cnt = 0;
for( int i = 0 ; i < N; i++ ){
nowt = -nowt;
point[cnt].x = nowx;
point[cnt].y = nowy;
point[cnt].statu = nowt;
cnt++;
for( int j = 1; j < a[i]; j++ ){
nowx++;
nowy += nowt;
point[cnt].x = nowx;
point[cnt].y = nowy;
point[cnt].statu = nowt;
cnt++;
}
nowx++;
}
sort( point, point + cnt );
int prey = point[0].y;
point[0].y = 0;
for( int i = 1; i < cnt; i++ ){
if( point[i].y != prey ){
prey = point[i].y;
point[i].y = point[i-1].y + 1;
}else{
point[i].y = point[i-1].y;
}
}
nowx = nowy = 0;
for( int i = 0; i < cnt; i++ ){
while( nowy < point[i].y ){
while( nowx < cnt ){
printf( " " );
nowx++;
}
printf( "\n" );
nowy++;
nowx = 0;
}
while( nowx < point[i].x ){
printf( " " );
nowx++;
}
if( point[i].statu == 1 ){
printf( "/" );
}else{
printf( "\\" );
}
nowx++;
}
while( nowx < cnt ){
printf( " " );
nowx++;
}
cout << endl;
}
return 0;
}