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;
}