题意分析

HDU - 6708

题意:给出一个整数k,要求你输出一个长和宽均为2k 的符合要求的矩阵。比如k等于1时输出

\[ \begin{matrix}
C & C \\
P & C
\end{matrix}
$$k = 2时输出
\]

\begin{matrix}

C & C & C & C \

P & C & P & C \

P & P & C & C \

C & P & P & C

\end{matrix}

\[样例乍一看好像是第一个矩阵规定为k=1这种样子,后一个矩阵则以前一个矩阵为基础,可以将矩阵平分为四块(竖着切和横着切),每一部分正好对应前一个矩阵的整体,只有左下角那一块例外,对应的是前一块矩阵的”反面“(也就是C变为P,P变为C),不过这样仍然没有什么思路,后来观察发现上一块矩阵的某一个元素刚好对应下一个矩阵的某一块元素,比如对于字母C,有
![](https://img2018.cnblogs.com/blog/1698539/201908/1698539-20190826092118108-339258886.png)

对应下一个矩阵的
![](https://img2018.cnblogs.com/blog/1698539/201908/1698539-20190826092148103-442681466.png)

对于字母P,有
![](https://img2018.cnblogs.com/blog/1698539/201908/1698539-20190826092207428-1916522697.png)

对应下一个矩阵的
![](https://img2018.cnblogs.com/blog/1698539/201908/1698539-20190826092222293-633953066.png)

这样根据它们的相对位置,就不难给出所有情况的矩阵了。具体位置关系在代码中给出。
## AC代码
关于代码,的确有些冗长,感觉应该有其他更简便方法表示这种规律,欢迎大佬评论指出。

```c
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
using namespace std;
const int maxn = 1024 + 10;
int T, k;
char s1[maxn][maxn], s2[maxn][maxn], s3[maxn][maxn], s4[maxn][maxn], s5[maxn][maxn], s6[maxn][maxn], s7[maxn][maxn], s8[maxn][maxn], s9[maxn][maxn], s10[maxn][maxn];
void init()
{
for(int i = 1; i <= 2; i++)
{
for(int j = 1; j <= 2; j++)
{
if(s1[i][j] == 'C')
{
//规律如下,此后的直接套用即可
for(int k = (j-1)*2+1; k <= (j-1)*2+2; k++)
s2[(i-1)*2+1][k] = 'C';
s2[(i-1)*2+2][(j-1)*2+1] = 'P', s2[(i-1)*2+2][(j-1)*2+2] = 'C';
}
else
{
for(int k = (j - 1)*2+1; k <= (j-1)*2+2; k++)
s2[(i-1)*2+1][k] = 'P';
s2[(i-1)*2+2][(j-1)*2+1] = 'C', s2[(i-1)*2+2][(j-1)*2+2] = 'P';
}
}
}
for(int i = 1; i <= 4; i++)
{
for(int j = 1; j <= 4; j++)
{
if(s2[i][j] == 'C')
{
for(int k = (j - 1)*2+1; k <= (j-1)*2+2; k++)
s3[(i-1)*2+1][k] = 'C';
s3[(i-1)*2+2][(j-1)*2+1] = 'P', s3[(i-1)*2+2][(j-1)*2+2] = 'C';
}
else
{
for(int k = (j - 1)*2+1; k <= (j-1)*2+2; k++)
s3[(i-1)*2+1][k] = 'P';
s3[(i-1)*2+2][(j-1)*2+1] = 'C', s3[(i-1)*2+2][(j-1)*2+2] = 'P';
}
}
}
for(int i = 1; i <= 8; i++)
{
for(int j = 1; j <= 8; j++)
{
if(s3[i][j] == 'C')
{
for(int k = (j - 1)*2+1; k <= (j-1)*2+2; k++)
s4[(i-1)*2+1][k] = 'C';
s4[(i-1)*2+2][(j-1)*2+1] = 'P', s4[(i-1)*2+2][(j-1)*2+2] = 'C';
}
else
{
for(int k = (j - 1)*2+1; k <= (j-1)*2+2; k++)
s4[(i-1)*2+1][k] = 'P';
s4[(i-1)*2+2][(j-1)*2+1] = 'C', s4[(i-1)*2+2][(j-1)*2+2] = 'P';
}
}
}
for(int i = 1; i <= 16; i++)
{
for(int j = 1; j <= 16; j++)
{
if(s4[i][j] == 'C')
{
for(int k = (j - 1)*2+1; k <= (j-1)*2+2; k++)
s5[(i-1)*2+1][k] = 'C';
s5[(i-1)*2+2][(j-1)*2+1] = 'P', s5[(i-1)*2+2][(j-1)*2+2] = 'C';
}
else
{
for(int k = (j - 1)*2+1; k <= (j-1)*2+2; k++)
s5[(i-1)*2+1][k] = 'P';
s5[(i-1)*2+2][(j-1)*2+1] = 'C', s5[(i-1)*2+2][(j-1)*2+2] = 'P';
}
}
}
for(int i = 1; i <= 32; i++)
{
for(int j = 1; j <= 32; j++)
{
if(s5[i][j] == 'C')
{
for(int k = (j - 1)*2+1; k <= (j-1)*2+2; k++)
s6[(i-1)*2+1][k] = 'C';
s6[(i-1)*2+2][(j-1)*2+1] = 'P', s6[(i-1)*2+2][(j-1)*2+2] = 'C';
}
else
{
for(int k = (j - 1)*2+1; k <= (j-1)*2+2; k++)
s6[(i-1)*2+1][k] = 'P';
s6[(i-1)*2+2][(j-1)*2+1] = 'C', s6[(i-1)*2+2][(j-1)*2+2] = 'P';
}
}
}
for(int i = 1; i <= 64; i++)
{
for(int j = 1; j <= 64; j++)
{
if(s6[i][j] == 'C')
{
for(int k = (j - 1)*2+1; k <= (j-1)*2+2; k++)
s7[(i-1)*2+1][k] = 'C';
s7[(i-1)*2+2][(j-1)*2+1] = 'P', s7[(i-1)*2+2][(j-1)*2+2] = 'C';
}
else
{
for(int k = (j - 1)*2+1; k <= (j-1)*2+2; k++)
s7[(i-1)*2+1][k] = 'P';
s7[(i-1)*2+2][(j-1)*2+1] = 'C', s7[(i-1)*2+2][(j-1)*2+2] = 'P';
}
}
}
for(int i = 1; i <= 128; i++)
{
for(int j = 1; j <= 128; j++)
{
if(s7[i][j] == 'C')
{
for(int k = (j - 1)*2+1; k <= (j-1)*2+2; k++)
s8[(i-1)*2+1][k] = 'C';
s8[(i-1)*2+2][(j-1)*2+1] = 'P', s8[(i-1)*2+2][(j-1)*2+2] = 'C';
}
else
{
for(int k = (j - 1)*2+1; k <= (j-1)*2+2; k++)
s8[(i-1)*2+1][k] = 'P';
s8[(i-1)*2+2][(j-1)*2+1] = 'C', s8[(i-1)*2+2][(j-1)*2+2] = 'P';
}
}
}
for(int i = 1; i <= 256; i++)
{
for(int j = 1; j <= 256; j++)
{
if(s8[i][j] == 'C')
{
for(int k = (j - 1)*2+1; k <= (j-1)*2+2; k++)
s9[(i-1)*2+1][k] = 'C';
s9[(i-1)*2+2][(j-1)*2+1] = 'P', s9[(i-1)*2+2][(j-1)*2+2] = 'C';
}
else
{
for(int k = (j - 1)*2+1; k <= (j-1)*2+2; k++)
s9[(i-1)*2+1][k] = 'P';
s9[(i-1)*2+2][(j-1)*2+1] = 'C', s9[(i-1)*2+2][(j-1)*2+2] = 'P';
}
}
}
for(int i = 1; i <= 512; i++)
{
for(int j = 1; j <= 512; j++)
{
if(s9[i][j] == 'C')
{
for(int k = (j - 1)*2+1; k <= (j-1)*2+2; k++)
s10[(i-1)*2+1][k] = 'C';
s10[(i-1)*2+2][(j-1)*2+1] = 'P', s10[(i-1)*2+2][(j-1)*2+2] = 'C';
}
else
{
for(int k = (j - 1)*2+1; k <= (j-1)*2+2; k++)
s10[(i-1)*2+1][k] = 'P';
s10[(i-1)*2+2][(j-1)*2+1] = 'C', s10[(i-1)*2+2][(j-1)*2+2] = 'P';
}
}
}
}
int main()
{
// freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
memset(s1, 'C', sizeof(s1));
cin >> T;
s1[2][1] = 'P';
init();
while(T--)
{
cin >> k;
for(int i = 1; i <= (int)(pow(2, k)); i++)
{
for(int j = 1; j <= (int)(pow(2, k)); j++)
{
if(k == 1)
cout << s1[i][j];
else if(k == 2)
cout << s2[i][j];
else if(k == 3)
cout << s3[i][j];
else if(k == 4)
cout << s4[i][j];
else if(k == 5)
cout << s5[i][j];
else if(k == 6)
cout << s6[i][j];
else if(k == 7)
cout << s7[i][j];
else if(k == 8)
cout << s8[i][j];
else if(k == 9)
cout << s9[i][j];
else if(k == 10)
cout << s10[i][j];
}
cout << endl;
}
}
}
```\]

【Windows Of CCPC HDU - 6708】【打表,找规律】的更多相关文章

  1. 数学--数论--HDU - 6322 打表找规律

    In number theory, Euler's totient function φ(n) counts the positive integers up to a given integer n ...

  2. HDU 4919 打表找规律 java睑板 map 递归

    == oeis: 点击打开链接 瞎了,x.mod(BigInteger.ValueOf(2)).equal( BigInteger.ValueOf(1)) 写成了 x.mod(BigInteger.V ...

  3. hdu 3032 Nim or not Nim? (SG函数博弈+打表找规律)

    Nim or not Nim? Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Sub ...

  4. HDU 5753 Permutation Bo (推导 or 打表找规律)

    Permutation Bo 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5753 Description There are two sequen ...

  5. HDU 5795 A Simple Nim(SG打表找规律)

    SG打表找规律 HDU 5795 题目连接 #include<iostream> #include<cstdio> #include<cmath> #include ...

  6. HDU 4731 Minimum palindrome 打表找规律

    http://acm.hdu.edu.cn/showproblem.php?pid=4731 就做了两道...也就这题还能发博客了...虽然也是水题 先暴力DFS打表找规律...发现4个一组循环节.. ...

  7. HDU 4861 Couple doubi (数论 or 打表找规律)

    Couple doubi 题目链接: http://acm.hust.edu.cn/vjudge/contest/121334#problem/D Description DouBiXp has a ...

  8. hdu 3032 Nim or not Nim? (sg函数打表找规律)

    题意:有N堆石子,每堆有s[i]个,Alice和Bob两人轮流取石子,可以从一堆中取任意多的石子,也可以把一堆石子分成两小堆 Alice先取,问谁能获胜 思路:首先观察这道题的数据范围  1 ≤ N ...

  9. HDU 3032 (SG打表找规律)

    题意: 有n堆石子,alice先取,每次可以选择拿走一堆石子中的1~x(该堆石子总数) ,也可以选择将这堆石子分成任意的两堆.alice与bob轮流取,取走最后一个石子的人胜利. 思路: 因为数的范围 ...

随机推荐

  1. 201809-2买菜 ccf

    只得了90分,很奇怪,有大佬指导一下吗 #include<stdio.h> int main() { ,sum=; scanf("%d",&n); *n],b[ ...

  2. Kotlin学习快速入门(1)——基本数据类型以及String常用方法使用

    本文适合有Java基础的人 Kotlin语法特点 相比java,省略括号,可以自动判断类型,省略new关键字,空指针捕获 主函数 kotlin文件(kt文件)中,只有要下列的方法,就可以运行,无需像之 ...

  3. Mybatis连接查询返回类型问题

    一对一映射 public class Card { private Integer id; private String num; private Student student; //重要 publ ...

  4. 【Android】Mac Android adb 配置

    打开终端,输入下面命令: touch .bash_profile open -e .bash_profile 即新建 “.bash_profile” 文件,并会弹出 “.bash_profile” 文 ...

  5. RGB颜色 三者都是0为黑色而255是白色 解释

    问题: RGB颜色 都是0为黑色而255是白色 与日常生活的黑色白色差距怎么那么大,(与物理学中的黑色吸收光是否相悖)而且为什么要这样定义呢? 链接:https://www.zhihu.com/que ...

  6. 运行sh文件

    记下在Ubuntu下安装*.sh和*.bin的简单方法. *.sh文件安装方法: 运行终端到文件目录下 1.在终端输入:sudo sh *.sh直接运行 2.在终端输入:sudo chmod +x * ...

  7. JS中以一个方法作为参数的写法

    一:以方法作为参数 这下来说直接以一个方法来作为参数的写法,直接上代码: -----------这样调用的方法------------- go(function(){ alert("succ ...

  8. java中线程安全,线程死锁,线程通信快速入门

    一:多线程安全问题 ###1 引入 /* * 多线程并发访问同一个数据资源 * 3个线程,对一个票资源,出售 */ public class ThreadDemo { public static vo ...

  9. 第二十二章 跳出循环-shift参数左移-函数的使用 随堂笔记

    第二十二章 跳出循环-shift参数左移-函数的使用 本节所讲内容: 22.1 跳出循环 22.2 Shift参数左移指令 22.3 函数的使用 22.4 实战-自动备份mysql数据库和nginx服 ...

  10. Postgresql部署及简单操作

    PostgreSQL是一个功能强大的开源对象关系数据库管理系统(ORDBMS),在开源数据库使用上与MySQL各领风骚.但也有不少人质疑postgresql的未来,正所谓,赞扬或批判一种数据库都必须先 ...