HDU-6708 Windows Of CCPC(打表,递归)

http://acm.hdu.edu.cn/showproblem.php?pid=6708

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Problem Description

In recent years, CCPC has developed rapidly and gained a large number of competitors .One contestant designed a design called CCPC Windows .The 1-st order CCPC window is shown in the figure:

HDU-6708 Windows Of CCPC(打表,递归)


 
 
 
 
And the 2-nd order CCPC window is shown in the figure:

HDU-6708 Windows Of CCPC(打表,递归)


 

 

 

 

 

 

 

We can easily find that the window of CCPC of order k is generated by taking the window of CCPC of order k1 as C of order k,and the result of inverting C/P in the window of CCPC of order k1 as P of order k.

And now I have an order k ,please output k-order CCPC Windows , The CCPC window of order k is a 2k2k matrix.

 

Input

The input file contains T test samples.(1<=T<=10)
The first line of input file is an integer T.
Then the T lines contains a positive integers k , (1k10

Output

For each test case,you should output the answer .

Sample Input

3
1
2
3

Sample Output

CC
PC
CCCC
PCPC
PPCC
CPPC
CCCCCCCC
PCPCPCPC
PPCCPPCC
CPPCCPPC
PPPPCCCC
CPCPPCPC
CCPPPPCC
PCCPCPPC

 

Source

 
这题比较麻烦的就是换行符的处理了,感觉可以用打表和递归做
 
 

递归

解题思路:

最开始是4个字符左下角那个和其余3个不一样,

用最初的可以拼成第2个,把第2个分成4部分,左下角和第一个相反,也就是P变为C,C变为P,其余相同。

一共要输出2^n行,那么可以一行一行的输出,假设我要输出总行为8行,现在要输出第1行,

那么其实是输出总行为4行的第1行输出两遍,

当输出左下角的部分时,这是总行为4行的相应行相反输出1遍,在输出1遍相同的。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <iostream>
 4 #include <string>
 5 #include <math.h>
 6 #include <algorithm>
 7 #include <vector>
 8 #include <queue>
 9 #include <set>
10 #include <map>
11 #include <math.h>
12 const int INF=0x3f3f3f3f;
13 typedef long long LL;
14 const int mod=1e9+7;
15 //const double PI=acos(-1);
16 const int maxn=1e5+10;
17 using namespace std;
18 //ios::sync_with_stdio(false);
19 //    cin.tie(NULL);
20 
21 //n表示图案一共有n层,row表示目前的层数 ,f表示是正常输出还是反着输出 
22 void solve(int n,int row,int f)
23 {
24     if(n==2)
25     {
26         if(f==1)
27         {
28             if(row==1)
29                 printf("CC");
30             else
31                 printf("PC");
32         }
33         else
34         {
35             if(row==1)
36                 printf("PP");
37             else
38                 printf("CP");
39         }
40         return ;
41     }
42     int t=row%(n/2);//t表示该图案row行是上一阶的多少行 
43     if(t==0)
44         t=n/2;
45     if(f==1)
46     {
47         if(row>n*1.0/2)
48             solve(n/2,t,0);
49         else
50             solve(n/2,t,1);
51         solve(n/2,t,1);
52     }
53     else if(f==0)
54     {
55         if(row>n*1.0/2)
56             solve(n/2,t,1);
57         else
58             solve(n/2,t,0);
59         solve(n/2,t,0);
60     }
61 }
62 
63 int main()
64 {
65     int n,T;
66     scanf("%d",&T);
67     while(T--)
68     {
69         scanf("%d",&n);
70         n=1<<n;
71         for(int i=1;i<=n;i++)
72         {
73             solve(n,i,1); 
74             printf("\n");
75         }
76     }
77     return 0;
78 }

 

 
STL打表
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <iostream>
 4 #include <string>
 5 #include <math.h>
 6 #include <algorithm>
 7 #include <vector>
 8 #include <queue>
 9 #include <set>
10 #include <map>
11 #include <math.h>
12 const int INF=0x3f3f3f3f;
13 typedef long long LL;
14 const int mod=1e9+7;
15 //const double PI=acos(-1);
16 const int maxn=1e5+10;
17 using namespace std;
18 //ios::sync_with_stdio(false);
19 //    cin.tie(NULL);
20    
21 vector<string> vt[15];
22 
23 int main()  
24 {    
25     ios::sync_with_stdio(false);  
26     cin.tie(NULL);  
27 
28     vt[1].push_back("CC");  
29     vt[1].push_back("PC");  
30     for (int i = 2; i <= 10; i++)
31     {
32         for (vector<string>::iterator it1 = vt[i - 1].begin(); it1 != vt[i - 1].end(); it1++) 
33         {  
34             vt[i].push_back(*it1 + *it1);  
35         }  
36         for (vector<string>::iterator it1 = vt[i - 1].begin(); it1 != vt[i - 1].end(); it1++) 
37         {  
38             string s1 = *it1;  
39             string s2 = "";
40             for (string::iterator it2 = s1.begin(); it2 != s1.end(); it2++) {  
41                 if (*it2 == C)  
42                     s2 += P;  
43                 else  
44                     s2 += C;  
45                       
46             }  
47             vt[i].push_back(s2 + *it1);  
48         }  
49     }  
50     int T;  
51     cin >> T;  
52     while (T--) 
53     {  
54         int i;  
55         cin >> i;  
56         for (vector<string>::iterator it1 = vt[i].begin(); it1 != vt[i].end(); it1++) 
57         {  
58             cout << *it1 << endl;  
59         }  
60     }  
61     return 0;  
62 }

 

还可以根据行数找规律
提前打表G[2^10+1][2^10+1],输出时两个for 1->2^k就行了,有空可以尝试一下
 
 
 
 
 
 

HDU-6708 Windows Of CCPC(打表,递归)

上一篇:烂泥:查看服务器的BIOS是否开启CPU虚拟化


下一篇:gitlab api(v3)使用