原题链接:https://vjudge.net/problem/UVA-177
分类:构造法
备注:思维推理,模拟
图像是每次上一个图像顺时针转90度与原图像的拼接,用上下左右对每条线段进行标记,很快就能找到规律,然后模拟即可,注意每次输出结尾是“^\n"
#include<bits/stdc++.h>
using namespace std;
int a[1<<15],n;
struct Point{
int x,y,d;//0表'|',1表'-'
bool operator < (const Point& rhs)const{
return x<rhs.x||(x==rhs.x&&y<rhs.y);
}
}p[1<<15];
int main(void){
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
a[1]=1; a[2]=2;
for(int i=2;i<=13;i++){
int len=1<<i;
for(int j=1;j<=len/4;j++){
if(a[j]==0)a[j+len/2]=1;
else if(a[j]==1)a[j+len/2]=0;
else if(a[j]==2)a[j+len/2]=3;
else a[j+len/2]=2;
}
for(int j=len/4+1;j<=len/2;j++)
a[j+len/2]=a[j];
}//0:左 1:右 2:上 3:下
int addX=0,addY=0;
while(~scanf("%d",&n)&&n){
int posX=0,posY=-1;
for(int i=1;i<=1<<n;i++){
if(a[i]==0){
p[i].d=1;
posY--;
addX=min(addX,posX);
addY=min(addY,posY);
p[i].x=posX;
p[i].y=posY;
posY--;
}else if(a[i]==1){
p[i].d=1;
posY++;
addX=min(addX,posX);
addY=min(addY,posY);
p[i].x=posX;
p[i].y=posY;
posY++;
}else if(a[i]==2){
p[i].d=0;
addX=min(addX,posX);
addY=min(addY,posY);
p[i].x=posX;
p[i].y=posY;
posX--;
}else {
p[i].d=0;
posX++;
addX=min(addX,posX);
addY=min(addY,posY);
p[i].x=posX;
p[i].y=posY;
}
}
addX=-addX; addY=-addY;
for(int i=1;i<=1<<n;i++)
p[i].x+=addX,p[i].y+=addY;
sort(p+1,p+1+(1<<n));
int row=0,col=0;
for(int i=1;i<=1<<n;i++){
if(p[i].x!=row){
printf("\n");
row=p[i].x;
col=0;
}
while(col<p[i].y)printf(" "),col++;
printf("%c",p[i].d?'_':'|'),col++;
}
printf("\n^\n");
}
return 0;
}