• 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:



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



     

     

     

     

     

     

     

    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("
    ");
    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就行了,有空可以尝试一下
     
     
     
     
     
     
  • 相关阅读:
    疯狂学java的第七天
    疯狂学java的第六天
    疯狂学java的第五天
    学java的第四天
    学java的第三天
    javaSE_20_常用API(包装类丶BigInteger类丶BigDecimal类 )
    javaSE_19_常用API(String类丶StringBuffer类)
    javaSE_17_内部类丶常用的引用类型用法总结
    javaSE_15_package和import丶访问控制权限
    javaSE_14_抽象类丶接口
  • 原文地址:https://www.cnblogs.com/jiamian/p/11403395.html
Copyright © 2020-2023  润新知