码迷,mamicode.com
首页 > 其他好文 > 详细

P1498 南蛮图腾

时间:2020-05-29 17:39:25      阅读:47      评论:0      收藏:0      [点我收藏+]

标签:数字   解决   输入   ==   不同   string   大小   put   异或运算   

题目描述

自从到了南蛮之地,孔明不仅把孟获收拾的服服帖帖,而且还发现了不少少数民族的智慧,他发现少数民族的图腾往往有着一种分形的效果,在得到了酋长的传授后,孔明掌握了不少绘图技术,但唯独不会画他们的图腾,于是他找上了你的爷爷的爷爷的爷爷的爷爷……帮忙,作为一个好孙子的孙子的孙子的孙子……你能做到吗?

输入格式

每个数据一个数字,表示图腾的大小(此大小非彼大小) n<=10

输出格式

这个大小的图腾

 

输入输出样例

输入 #1
2
输出 #1
   /  /__ /\  //__\/__
输入 #2
3
输出 #2
       /      /__     /\  /    /__\/__   /\      /  /__\    /__ /\  /\  /\  //__\/__\/__\/__\


本题的解法还是有规律可循的

这道题可以用异或的位运算知识来解决、
异或(^)可以把两个二进制数的每一位,相同的变为0,不同的变为1
比如:1^0=1,1^1=0,0^0=0
这样就可以比较简便地把这道题解决了
首先,用一个a[i][j]数组,来存放是否输出符号,这个数组a[i][j]可以通过:a[i][j]=a[i-1][j]^a[i-1][j-1]来判断是否输出字符,如果说当前(i,j)
这个点的异或结果为1,就说明它的左上方或右上方有字符,那么这个(i,j)位置就应该输出一次字符,否则,即为它的左上方和右上方均有或均没有字符,输
出空格
之后,遇到奇数行的时候,则输出为:/\;偶数行则输出:/__\,如果这个位置不能输出,则填补上相应的空格占位
最后,记得在每一行的开头输出空格
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<math.h>
using namespace std;
int n;
int a[1025]={1};
int main(void)
{
    scanf("%d",&n);
    
    for(int i=0;i<(1<<n);i++)
    {
        for(int j=1;j<(1<<n)-i;j++) printf(" ");//前置空格
        for(int j=i;j>=0;j--)
        {
            a[j]=a[j]^a[j-1];//进行异或运算
        }
        if(!(i%2))//为奇数行
        {
            for(int j=0;j<=i;j++) 
            {
                if(a[j]==1) printf("/\\");
                else printf("  ");
            }
        } 
        else//为偶数行
        {
            for(int j=0;j<=i;j+=2)
            {
                if(a[j]==1) printf("/__\\");
                else printf("    ");
            }
        }
        printf("\n");
    }
    
    return 0;
}

 



P1498 南蛮图腾

标签:数字   解决   输入   ==   不同   string   大小   put   异或运算   

原文地址:https://www.cnblogs.com/jd1412/p/12988467.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!