HDU 3257 Hello World!(位运算&模拟)

神头鬼脸的位运算

传送门

Problem Description
Your task is to print … er … “Hello World” … in a fantastic way – using a beautiful font.

I’ve sent you a nice font for you to use, but I’m too busy to tell you how. Can you help yourself?

Input
The first line contains a single integer T (T <= 20), the number of test cases.
Each case begins with an integer C (1 <= C <= 80) in a single line, then each of the following C lines contains five two-digit numbers in hex (letters will be in uppercase). Don’t ask me what they mean, I’m too busy…

Output
For each test case, print the case number in the first line, then followed by a blank line.
After that, print all T characters. Use a single blank column of spaces between two consecutive characters. Each line should have exactly 6C-1 character (again, don’t ask me why).
Don’t forget to print another blank line after the output of each test case.

Sample Input
2
11
7F 08 08 08 7F
38 54 54 54 18
00 41 7F 40 00
00 41 7F 40 00
38 44 44 44 38
00 00 00 00 00
3F 40 38 40 3F
38 44 44 44 38
7C 08 04 04 08
00 41 7F 40 00
38 44 44 48 7F
5
14 08 3E 08 14
04 02 01 02 04
40 40 40 40 40
04 02 01 02 04
14 08 3E 08 14

Sample Input
2
11
7F 08 08 08 7F
38 54 54 54 18
00 41 7F 40 00
00 41 7F 40 00
38 44 44 44 38
00 00 00 00 00
3F 40 38 40 3F
38 44 44 44 38
7C 08 04 04 08
00 41 7F 40 00
38 44 44 48 7F
5
14 08 3E 08 14
04 02 01 02 04
40 40 40 40 40
04 02 01 02 04
14 08 3E 08 14

Sample Output

要点:

  • scanf("%x",&balabala…)读入十六进制
  • 输出先列后行,两个十六进制字符为一列,输入的每五组十六进制对应输出的一个字符
  • 格式:输出的每个字符间有空格,最后一个没有(6*C-1的原因),依题意最后还要回车
  • 位运算判断每个二进制的值
  • eg.0X7F = 0111 1111从上往下,为零的是空格,为一的是#
  • 判断第k位是否为零:a[j]&1<<k
  • 出题人真的很皮欸 (~ ̄▽ ̄)→)) ̄▽ ̄)o
#include <stdio.h>
int main()
{
    int a[5],c,t,cnt=0;
    char ans[7][512];
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&c);
        for(int i=0; i<c; i++)
            for(int j=0; j<5; j++)
            {
                scanf("%X",&a[j]);
                for(int k=6; k>=0; k--)
                    ans[k][i*5+j] = (a[j]&1<<k)?'#':' ';
            }
        printf("Case %d:\n\n",++cnt);
        for(int j=0; j<7; j++)
        {
            for(int k=0; k<5*c; k++)
                (k%5==0&&k!=0)?printf(" %c",ans[j][k]):printf("%c",ans[j][k]);
            printf("\n");
        }
        printf("\n");
    }
    return 0;
}

Emmmm…
后来想了想其实可以直接输出的…
之前做复杂了
,ԾㅂԾ,

#include <stdio.h>
int main()
{
    int a[400],c,t,cnt = 0;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&c);
        for(int i=0; i<c; i++)
            for(int j=1; j<=5; j++)
                scanf("%X",&a[i*5+j]);
        printf("Case %d:\n\n",++cnt);
        for(int i=0; i<7; i++)
        {
            for(int j=1,k=1; j<=5*c; j++,k++)
            {
                if(k%6==0)
                    printf(" "),k=1;
                printf("%c",(a[j]&1)?'#':' ');
                a[j] >>= 1;
            }
            printf("\n");
        }
        printf("\n");
    }
    return 0;
}
### 2024 HDU 位运算 示例 教程 #### 什么是位运算位运算是指对二进制数中的每一位进行操作。常见的位运算符包括按位与 (`&amp;`)、按位或 (`|`)、按位异或 (`^`)、左移 (`&lt;&lt;`) 和右移 (`&gt;&gt;`)。 #### 杭州电子科技大学(HDU位运算目解析 对于给定的代码片段: ```cpp for (int i = 1; i &lt; (1 &lt;&lt; n); i++) { if ((i &gt;&gt; 1) &amp; i) continue; } ``` 这段代码用于遍历 `n` 个元素的所有子集,并过滤掉某些特定条件下的子集。具体解释如下: - `(1 &lt;&lt; n)` 表示将数字 `1` 左移 `n` 位,相当于计算 \(2^n\) 的值[^3]。 - `i &gt;&gt; 1` 将变量 `i` 右移一位,相当于除以 2。 - `(i &gt;&gt; 1) &amp; i` 判断当前子集中是否存在相邻位置都为 1 的情况。如果存在,则跳过该次循环。 #### 实际应用案例 假设有一个数组 `[a, b, c]`,即 `n=3`,则上述代码会生成并筛选这些子集: - 子集表示法:`{}` 对应于二进制 `000` - `{a}` 对应于二进制 `001` - `{b}` 对应于二进制 `010` - `{c}` 对应于二进制 `100` - `{a, b}` 对应于二进制 `011` (被过滤) - `{a, c}` 对应于二进制 `101` - `{b, c}` 对应于二进制 `110` (被过滤) - `{a, b, c}` 对应于二进制 `111` (被过滤) 通过这种方式,可以有效地排除那些不符合特定条件的组合。 #### Python 中的位运算示例 以下是类似的逻辑在 Python 中的实现方式: ```python def generate_subsets(n): result = [] for i in range(1, 1 &lt;&lt; n): # 遍历所有可能的子集 if not (i &amp; (i - 1)): # 过滤掉含有连续 &#39;1&#39; 的子集 subset = [j for j in range(n) if (i &gt;&gt; j) &amp; 1] result.append(subset) return result print(generate_subsets(3)) ``` 此函数将会输出符合条件的子集列表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值