hdu 3257 Hello World!

 

 http://acm.hdu.edu.cn/showproblem.php?pid=3257

这是一道09年宁波赛区网络赛的题目,个人觉得题目比较不错!

给你一些十六进制的数,然后让你模拟出这些数所要表达的意思。

思路是这样的:先将这些十六进制数转化成二进制的数,然后将二进制的数按照列优先方式进行存储,当二进制位是0时,输出空格,是1时,输出‘#’,

而且输出是从下向上输出的,就是输出的图形要尽量靠着最下端输出。

做这道题的时候,分析的还是挺对的,但是,写出来以后,发现有一种情况没有分析清楚,就是要判断上面的一行或者下面的一行是不是全是空格,如果全是空格,就从下面一

行或者上面一行开始找起,这里害我错了好多次的。

我写的代码比较长,思路不是很有条理,凑活着看吧

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

string str[17]={"0000","0001","0010","0011","0100","0101","0110","0111",
"1000","1001","1010","1011","1100","1101","1110","1111"};
char map[8][500];

//将十六进制转换成二进制
string trans(string ch)
{
   string s="";
   for(int i=0;i<2;i++)
   {
      if(ch[i]>='A'&&ch[i]<='F')
         s+=str[ch[i]-'A'+10];
      else
         s+=str[ch[i]-'0'];
   }
   return s;
}

int main()
{
   string ch,str;
   int t,n,i,j,k,p;
   scanf("%d",&t);
   for(int Case=1;Case<=t;Case++)
   {
      scanf("%d",&n);
      int minx=10,maxn=-1;
      p=0;
      for(i=0;i<n;i++)
      {
         for(k=0;k<5;k++)
         {
            str="";
            ch="";
            cin>>ch;
            ch=trans(ch);
            for(j=0;j<=7;j++)
            {
               if(ch[j]=='1')
                  map[j][p]='#';
               else map[j][p]=' ';
            }
            p++;
         }
         if(i!=n-1)
         {
            for(j=0;j<=7;j++)
               map[j][p]=' ';
            p++;
         }
      }
      printf("Case %d:\n\n",Case);
      bool flag=0,tag=0;
      for(i=7;i>=0;i--)
      {
         for(j=0;j<p;j++)
            if(map[i][j]=='#') {flag=1;break;}
         if(flag) break;
      }
      for(k=0;k<=7;k++)
      {
         for(j=0;j<p;j++)
            if(map[k][j]=='#') {tag=1;break;}
         if(tag) break;
      }
      for(;i>=k;i--)
      {
         for(j=0;j<p;j++)
            printf("%c",map[i][j]);
         printf("\n");
      }
      printf("\n");
   }
  
   return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值