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 k−1 as C of order k,and the result of inverting C/P in the window of CCPC of order k−1 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 2k∗2k 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 , (1≤k≤10)

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

2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛

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

递归

解题思路:

最开始是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就行了,有空可以尝试一下

原文地址:https://www.cnblogs.com/jiamian/p/11403395.html

时间: 2024-09-29 03:17:21

HDU-6708 Windows Of CCPC(打表,递归)的相关文章

hdu acm 1425 sort(哈希表思想)

sort Time Limit: 6000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 25803    Accepted Submission(s): 7764 Problem Description 给你n个整数,请按从大到小的顺序输出其中前m大的数. Input 每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且

hdu 5351 MZL&#39;s Border 打表+高精度

MZL's Border Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 462    Accepted Submission(s): 127 Problem Description As is known to all, MZL is an extraordinarily lovely girl. One day, MZL was pl

hdu 4923 Room and Moor(线性表)

题目链接:hdu 4923 Room and Moor 题目大意:给定一个序列a,元素由0,1组成,求一个序列b,元素在0~1之间,并且保证递增.输出最小的∑(ai?bi)2, 解题思路:首先剔除为首的0,和末尾的1,然后将中间部分成若干段由连续1开头,连续0结尾的各个段落.对于每一段有一个最优的值x=aa+b(a为1的个数,b为0的个数),用栈维护各个段的x值,如果当前x值小于前面一个段的x值,那么就要将两个段合并,a=ai?1+ai,b=bi?1+bi. #include <cstdio>

hdu 5180 状态压缩 dp 打表

hdu 5180 状态压缩 dp 打表 题意: 在n*n的国际象棋中,放置若干个国王和k个车,使得国王之间不互相攻击,车之间不互相攻击,车不可攻击到国王(这并不代表国王不能攻击到车).国王能攻击到它上下左右,左上左下右上右下八个位置的棋子,车可以攻击到同一行或同一列中的棋子,求方案总数对1000000007取模后的值. 限制: 1 <= n <=15; 0 <= k <=15 思路: 状态压缩,dp,打表套打表 打表程序如下: 打表程序1: tab[a][b]表示a*b的棋盘王的放

HDU 1058 Humble Numbers (dp+打表)

先是想筛法素数表啊,然后1~2000000000枚举打表啊,结果越想越不对. 后来想到唯一分解定理,可是怎么实现呢..果然还是需要努力啊.. 研究了discuss代码,码之~ ~~~~ dp的思想,若dp[i]是Humble Numbers,那么dp[i]*2,dp[i]*3,dp[i]*5,dp[i]*7都将是Humble Numbers. 所以只需要注意连续性便好了. #include<cstdio> #include<algorithm> #include<cmath&

常见Windows系统变量对应表

常见Windows系统变量对应表 ?Lander Zhang 专注外企按需IT基础架构运维服务,IT Helpdesk 实战培训践行者http://blog.51cto.com/lander 2018/11/08 8:00 问题描述 日常 Windows 运维管理中经常要写一些脚本,需要知道一些对常见的系统变量比较了解. 常见系统变量对应表 %WINDIR% = 系统目录 C:\WINDOWS %SYSTEMROOT% = 系统目录 C:\WINDOWS} %SYSTEMDRIVE% = 系统根

windows下mysql数据库表名大小写不敏感

最近新入职,领导让做个小功能先练练手.是一个添加分类的功能,有添加和列表,很简单.功能做完后提交,结果在线上出现一个大大的500. 但是我再本地环境下是正常的,我以为可能是php的版本不一致导致的问题,就仔细看代码,看看有没有什么不合理的地方,然后在提交,还是500.然后又看,又提,依然是500.很不解啊,只有问领导了,领导说,是线上mysql字段设置了大小写敏感,遂改之,结果还是500.领导再一看,我靠了,表名应该是首字母大写的,但是我本地是小写. 大坑啊.原来开发创建的表都是小写的,所以原来

hdu 4850 字符串构造---欧拉回路构造序列 递归+非递归实现

http://acm.hdu.edu.cn/showproblem.php?pid=4850 题意:构造长度为n的字符序列,使得>=4的子串只出现一次 其实最长只能构造出来26^4+4-1= 456979 的序列,大于该数的都是不可能的.构造方法,就是那种欧拉回路的序列,此题DFS会爆栈,手动扩展栈也可以AC...... 递归形式的开始WA了,没有细调就换非递归了,后来又想了想,虽然自己电脑上运行不了,但是先把长度按小的来,然后调试代码,然后在扩大,AC了,当时错在MOD,递归的MOD应该是26

HDU 1043 Eight(反向BFS+打表+康托展开)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 题目大意:传统八数码问题 解题思路:就是从“12345678x”这个终点状态开始反向BFS,将各个状态记录下来,因为数字太大所以用康托展开将数字离散化. 代码: 1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 #include<st