Hnu.cg程序设计训练3.11数码管
【问题描述】
液晶数码管用七笔阿拉数字表示的十个数字,把横和竖的一 个短划都称为一笔,即7有3笔,8有7笔等。对于十个数字一种排列,要做到两相邻数字都可以由另一个数字加上几笔或减去几笔组成,但不能又加又减。比如 7→3是允许的,7→2不允许。任意输入一组数,判断是否符合上述规则,注意,1在右边。
【输入形式】
每行输入一个0~9的排列,数字之间用空格分隔,以-1作为输入结束
【输出形式】
输出YES或NO
【样例输入】
4 1 0 7 3 9 5 6 8 2 3 5 1 6 2 7 9 0 4 8 -1
【样例输出】
YES NO
【思路说明】
首先要了解题目中的 “液晶数码管用七笔阿拉数字表示的十个数字,把横和竖的一 个短划都称为一笔 ” 具体是什么,如上图,其实这道题可以直接列举每一个数字通过只加或只减几笔可以转变成的数字,这是最好理解的方法了。列举完之后,这道题其实已经完成了一半,这道题中选择用字符串,是因为很简便,下面代码可以很明显的看出这种方法的优点。
将上面我们找出的可以转变的对应数字存到字符串中,只需要截取输入的相邻的两个字符,与前面的字符对照,看是否存在即可。若每个字符串都存在,输出"YES",否则,"NO"。
下面是可以相互转换的数字:
0--1,7,8
1--0,3,4,7,8,9
2--8
3--1,7,8,9
4--1,9
5--6,8,9
6--5,8
7--0,1,3,8,9
8--0,1,2,3,5,6,7,9
9--1,3,4,5,7,8
【代码如下】
#include <iostream>
using namespace std;
int main()
{
string s="01,07,08,10,13,14,17,18,19,28,31,37,38,39,41,49,56,58,59,65,68,70,71,73,78,79,80,81,82,83,85,86,87,89,91,93,94,95,97,98";
//将可以相互转换的数字存储进字符串中
int n;
string str;
while(cin>>n)
{
str.clear();
//每次循环都要清除一下 str
if(n==-1)break;
str.push_back((n+'0'));
//要将单个数字变成字符存储进 str,通过 +'0'实现
int a,sum=0;
for(int i=0;i<9;i++)
{
cin>>a;
str.push_back((a+'0'));
//将输入的数字全部以字符形式存储进 str中
}
for(int i=0;i<9;i++)
{
string ss=str.substr(i,2);//substr()是字符截取函数
//遍历,将每两个相邻的字符截取下来
if(s.find(ss)!=s.npos)sum++;
//如果在 s中找到了ss,说明这两个相邻的数字可以转化
else
{
cout<<"NO"<<endl;
break;
}
}
if(sum==9)cout<<"YES"<<endl;
//说明这九个数字,每两个相邻都可以转化
}
}