rqnoj吧 关注:56贴子:180
  • 4回复贴,共1

变态题Niop2008(普及组-4)我终于作好了!!!

只看楼主收藏回复

program biantaiti; 
var a:array[1..200,1..200]of char; 
 b:array[1..200,1..200]of integer; 
 n,m,x1,x2,y1,y2,x3,z1,z2:integer; 
procedure huatu(i,j:integer); 
 var k1,k2:integer; 
 begin 
 a[i,j]:='+'; 
 a[i,j+4]:='+'; 
 a[i-3,j]:='+'; 
 a[i-3,j+4]:='+'; 
 a[i-2,j+6]:='+'; 
 a[i-5,j+2]:='+'; 
 a[i-5,j+6]:='+'; 
 a[i-4,j+1]:='/'; 
 a[i-4,j+5]:='/'; 
 a[i-1,j+5]:='/'; 
 for k1:=j+3 to j+5 do a[i-5,k1]:='-'; 
 for k1:=j+1 to j+3 do a[i-3,k1]:='-'; 
 for k1:=j+1 to j+3 do a[i,k1]:='-'; 
 for k1:=i-1 downto i-2 do a[k1,j]:='|'; 
 for k1:=i-1 downto i-2 do a[k1,j+4]:='|'; 
 for k1:=i-3 downto i-4 do a[k1,j+6]:='|'; 
 for k1:=i-1 downto i-2 do 
 for k2:=j+1 to j+3 do a[k1,k2]:=' '; 
 for k1:=j+2 to j+4 do a[i-4,k1]:=' '; 
 a[i-3,j+5]:=' '; 
 a[i-2,j+5]:=' '; 
 end; 
begin 
 readln(n,m); 
 for x1:=1 to n do begin 
 for x2:=1 to m do 
 read(b[x1,x2]); 
 readln; 
 end; 
 y1:=0; 
 for x1:=1 to n do 
 for x2:=1 to m do 
 if y1<b[x1,x2]*3+1+(n-x1+1)*2 then 
 y1:=b[x1,x2]*3+1+(n-x1+1)*2; 
 y2:=m*4+n*2+1; 
 z1:=y1; 
 z2:=y2; 
 for x1:=1 to y1 do 
 for x2:=1 to y2 do 
 a[x1,x2]:='.'; 
 y2:=n*2-1; 
 y1:=y1-2*n+2; 
 for x1:=1 to n do begin 
 for x2:=1 to m do begin 
 for x3:=1 to b[x1,x2] do begin 
 huatu(y1,y2); 
 y1:=y1-3; 
 end; 
 y1:=y1+3*b[x1,x2]; 
 y2:=y2+4; 
 end; 
 y1:=y1+2; 
 y2:=1+(n-x1-1)*2; 
 end; 
 for x1:=1 to z1 do begin 
 for x2:=1 to z2 do 
 write(a[x1,x2]); 
 writeln; 
 end; 
 readln; 
end. 


1楼2008-11-18 20:37回复
    • 58.35.128.*
    好厉害!


    2楼2008-12-03 18:39
    回复


      IP属地:浙江4楼2012-04-02 22:32
      回复
        还是比较好做 (题解
        http://www.cnblogs.com/oijzh/archive/2012/10/28/2744051.html
        /*==============================*\| C++ Code| http://oijzh.cnblogs.com| By jiangzh\*==============================*/#include<cstdio>#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))#define INF 0x7fffffff int n,m,c[100][100];char map[10000][10000];int maxx=1500,minx=1500,maxy=1500,miny=1500; void work(int x,int y)//带入左下角的点坐标{ maxx=max(maxx,x);minx=min(minx,x-5); maxy=max(maxy,y+6);miny=min(miny,y); map[x][y]=map[x][y+4]='+';map[x][y+1]=map[x][y+2]=map[x][y+3]='-';//map[x][y+5]=map[x][y+6]='.'; x--; map[x][y]=map[x][y+4]='|';map[x][y+1]=map[x][y+2]=map[x][y+3]=' ';map[x][y+5]='/';//map[x][y+6]='.'; x--; map[x][y]=map[x][y+4]='|';map[x][y+1]=map[x][y+2]=map[x][y+3]=' ';map[x][y+5]=' ';map[x][y+6]='+'; x--; map[x][y]=map[x][y+4]='+';map[x][y+1]=map[x][y+2]=map[x][y+3]='-';map[x][y+5]=' ';map[x][y+6]='|'; x--; /*map[x][y]='.';*/map[x][y+1]=map[x][y+5]='/';map[x][y+2]=map[x][y+3]=map[x][y+4]=' ';map[x][y+6]='|'; x--; /*map[x][y]=map[x][y+1]='.';*/map[x][y+2]=map[x][y+6]='+';map[x][y+3]=map[x][y+4]=map[x][y+5]='-';} int main(){ freopen("ty1009.in","r",stdin); freopen("ty1009.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&c[i][j]); for(int i=0;i<3000;i++) for(int j=0;j<3000;j++) map[i][j]='.'; int xx=1500,yy=1500; for(int i=1;i<=n;i++) { int x=xx,y=yy; for(int j=1;j<=m;j++) { for(int k=1;k<=c[i][j];k++) { work(xx,yy); xx-=3; } yy+=4;xx=x; } yy=y-2;xx=x+2; } for(int i=minx;i<=maxx;i++) { for(int j=miny;j<=maxy;j++) printf("%c",map[i][j]); printf("\n"); } return 0;}


        5楼2012-11-01 13:30
        回复