第八章习题 E - Paper Folding

/*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;
}

猜你喜欢

转载自blog.csdn.net/JXUFE_ACMer/article/details/81385689