题目链接:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=647
题目意思:
将一个整数用给定的‘-’,‘|’的规则给表示出来。
规则:用s个“-”表示水平线段,s个“|”表示竖直线段。每一个阿拉伯数字占用s+2列和2s+3行。注意那些数字中的空白之处要填上空格,并且两个数字之间必须有一个空列。在每一个整数后面输出一个空行。
解题思路:
大体上分成两部分,水平部分和竖直部分。
代码:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#define eps 1e-6
#define INF (1<<20)
#define PI acos(-1.0)
using namespace std;
char ans[30][150],temp[20];
int s;
void solve(int i,int len)
{
int start=(i-1)*(s+3)+1; //注意这个数开始的位置
switch(temp[i-1])
{
case '1':for(int j=1;j<=s;j++)
ans[j+1][start+s+1]=ans[j+1+s+1][start+s+1]='|';
break;
case '2':for(int j=1;j<=s;j++)
ans[1][j+start]=ans[s+2][j+start]=ans[2*s+3][j+start]='-';
for(int j=1;j<=s;j++)
ans[j+1][start+s+1]=ans[j+1+s+1][start]='|';
break;
case '3':for(int j=1;j<=s;j++)
ans[1][j+start]=ans[s+2][j+start]=ans[2*s+3][j+start]='-';
for(int j=1;j<=s;j++)
ans[j+1][start+s+1]=ans[j+1+s+1][start+s+1]='|';
break;
case '4':for(int j=1;j<=s;j++)
ans[2+s][start+j]='-';
for(int j=1;j<=s;j++)
ans[j+1][start]=ans[j+1][start+s+1]=ans[j+s+2][start+s+1]='|';
break;
case '5':for(int j=1;j<=s;j++)
ans[1][j+start]=ans[s+2][j+start]=ans[2*s+3][j+start]='-';
for(int j=1;j<=s;j++)
ans[j+1][start]=ans[j+1+s+1][start+s+1]='|';
break;
case '6':for(int j=1;j<=s;j++)
ans[1][j+start]=ans[s+2][j+start]=ans[2*s+3][j+start]='-';
for(int j=1;j<=s;j++)
ans[j+1][start]=ans[j+s+2][start]=ans[j+s+2][start+s+1]='|';
break;
case '7':for(int j=1;j<=s;j++)
ans[1][j+start]='-';
for(int j=1;j<=s;j++)
ans[j+1][start+s+1]=ans[j+1+s+1][start+s+1]='|';
break;
case '8':for(int j=1;j<=s;j++)
ans[1][j+start]=ans[s+2][j+start]=ans[2*s+3][j+start]='-';
for(int j=1;j<=s;j++)
ans[j+1][start]=ans[j+1][start+s+1]=ans[j+s+2][start]=ans[j+s+2][start+s+1]='|';
break;
case '9':for(int j=1;j<=s;j++)
ans[1][j+start]=ans[s+2][j+start]=ans[2*s+3][j+start]='-';
for(int j=1;j<=s;j++)
ans[j+1][start]=ans[j+1][start+s+1]=ans[j+s+2][start+s+1]='|';
break;
case '0':for(int j=1;j<=s;j++)
ans[1][j+start]=ans[2*s+3][j+start]='-';
for(int j=1;j<=s;j++)
ans[j+1][start]=ans[j+1][start+s+1]=ans[j+s+2][start]=ans[j+s+2][start+s+1]='|';
break;
}
return ;
}
void init(int len)
{
int sumcol=(s+3)*len;
for(int i=1;i<=(2*s+3);i++)
for(int j=0;j<sumcol;j++)
ans[i][j]=' '; //初始化为全部为空
for(int i=1;i<=(2*s+3);i++)
ans[i][sumcol]='\0'; //最后一列为‘\0'作为输出字符串的结束
return ;
}
int main()
{
while(scanf("%d %s",&s,temp)!=EOF)
{
if(s==0&&*temp=='0')
break;
int len=strlen(temp);
init(len); //初始化
for(int i=1;i<=len;i++)
solve(i,len); //对每一个数字进行处理
for(int i=1;i<=2*s+3;i++)
printf("%s\n",ans[i]+1); //一行一行的输出,每行从1开始
putchar('\n');
}
return 0;
}
本文提供了一种使用C++语言解决UVa在线评测平台问题647的方法,该问题要求将整数用给定的'-'和'|'符号表示。文章详细解释了解题思路并附上了实现代码。
5728

被折叠的 条评论
为什么被折叠?



