/*SE:wn------王宁*/
/*这一题我是按照这位 https://blog.csdn.net/weizhuwyzc000/article/details/47038989 的方式写的,我主要讲一下自己实现的注意点和一些体会*/
/*首先是题意的理解:自己去折纸只提示一点,最底下那“张”永远是最小单位的纸张区域
然后关于规律和路线思想的提出,请看原网站。
详解路线:知道路线之后从当前位置出发画图,需要根据前一位的状态来确定在矩阵中的位置,
比如前面是下,现在是右,你要表现出这个效果,只需在同一行的下一格画横线即可
然而如果前面是上,现在是右,你就应该回退到上一行的下一格了
关于矩阵大小,我是挺不放心原作者的定义的,所以我考虑了最坏情况,如果只往一个方向翻,
最多能翻13次,因为初始边最大是1,所以是1<<13=8192,因为四个方向都有可能,所以定义了18000*18000
关于max_c[18000]:防止输出多余空格
关于 min_r,max_r,max_c[18000],min_c,为了圈定输出区域
关于 cur_r,cur_c:表明当前位置
还有就是你要操作几个的问题,在58行的for(i=2;i<=len;i++),请仔细体会。
*/
#include<bits/stdc++.h>
using namespace std;
char ac[18000][18000];
int min_r,max_r,max_c[18000],min_c;
int cur_r,cur_c;
int main()
{
int n,i,j;
char route[8888]; route[1]='r'; route[2]='u';
int len=2;
for(i=2;i<=13;++i)
{
for(j=1;j<=len/2;j++)
{
if(route[j]=='r') route[j+len]='l';
else if(route[j]=='l') route[j+len]='r';
else if(route[j]=='u') route[j+len]='d';
else route[j+len]='u';
}
for(j=len/2+1;j<=len;j++)
{
route[j+len]=route[j];
}
len=len*2;
}
int team=1<<13;
team++;
route[team]='\0';
while(~scanf("%d",&n)&&n)
{
min_r=18001,max_r=-1,min_c=18001;
memset(max_c,-1,sizeof(max_c));
memset(ac,0,sizeof(ac));
cur_r=9000,cur_c=9000;
ac[cur_r][cur_c]='_';
//在这里弄错了两个地方:忘了在第三个那里加上min;在最后一个max中是当前行的最大列,所以后面那个参数因当时当前列——cur_column
min_r=min(min_r,cur_r); max_r=max(max_r,cur_r); min_c=min(min_c,cur_c); max_c[cur_r]=max(max_c[cur_r],cur_c);
len=1<<n;
for(i=2;i<=len;i++)
{
if(route[i]=='r')
{
if(route[i-1]=='u') ac[--cur_r][++cur_c]='_';
else ac[cur_r][++cur_c]='_';
}
else if(route[i]=='l')
{
if(route[i-1]=='u') ac[--cur_r][--cur_c]='_';
else ac[cur_r][--cur_c]='_';
}
else if(route[i]=='u')
{
if(route[i-1]=='r') ac[cur_r][++cur_c]='|';
else ac[cur_r][--cur_c]='|';
}
else if(route[i]=='d')
{
if(route[i-1]=='r') ac[++cur_r][++cur_c]='|';
else ac[++cur_r][--cur_c]='|';
}
min_r=min(min_r,cur_r); max_r=max(max_r,cur_r); min_c=min(min_c,cur_c); max_c[cur_r]=max(max_c[cur_r],cur_c);
}
for(i=min_r;i<=max_r;++i)
{
for(j=min_c;j<=max_c[i];++j)
{
if(ac[i][j]==0) printf(" ");
else printf("%c",ac[i][j]);
}
printf("\n");
}
printf("^\n");
}
return 0;
}
第八章习题 E - Paper Folding
猜你喜欢
转载自blog.csdn.net/JXUFE_ACMer/article/details/81385689
今日推荐
周排行