【問題描述】
液晶數碼管用七筆阿拉數字表示的十個數字,把橫和豎的一 個短劃都稱爲一筆,即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
要處理的問題:
1.想要判斷是否能夠轉化,當然我們可以將各個數字能夠轉化的數字列舉出來,但是我們可以轉化思想,使問題變得更加簡便。
2.將8的七條邊寫上編號,分別爲1,2,3,4,5,6,7.
3.將0-9這是個數用二進制串表示出來,1代表該條邊存在,0代表該條邊不存在。
4.如何證明能否轉化,則看數字對應二進制串存在的邊是否爲包含或者被包含的關係。
邊界條件:
1.8數字可以跟所有數字進行轉化
2.1數字的兩條邊在右邊。1與6不能相互轉化。
通過上述分析,將採用下面的方法解決相關問題:
- 將各個數字設置成二進制串:
0="1111110";
1="0110000";
2="1101101";
3 ="1111001";
4="0110011";
5="1011011";
6="1011111";
7="1110000";
8="1111111";
9="1111011";
- 設計一個算法查找兩個數字的中的1的位置是否爲包含或者被包含的關係
- 利用異或^和位或&的相關性質。
- 定義一個結構體數組,成員函數爲數字和對應的二進制串。
- 定義一個bool類型的函數,看是否符合包含或者被包含的關係。
2.該函數中的算法包括,異或的性質:即查看有哪些位置的數字不相同,即爲需要更改的邊,如果需要,同時將1變爲0,這是取消一條邊,將0變爲1,加上一條邊,則說明不符合條件。
3.需要更改的邊,與1的個數較少的二進制串進行位或運算,在於另一條邊比較,查看是否相等,即證是否爲包含或者被包含的關係。
#include<iostream>
using namespace std;
struct S
{
int num;
string a;
}s[10];
bool f(int x,int y);
int main()
{
for(int i=0;i<10;i++)
{
s[i].num=i;
}
s[0].a="1111110"; //包含與被包含的關係
s[1].a="0110000";
s[2].a="1101101";
s[3].a="1111001";
s[4].a="0110011";
s[5].a="1011011";
s[6].a="1011111";
s[7].a="1110000";
s[8].a="1111111";
s[9].a="1111011";
int b[10]={0};
while(1)
{
for(int i=0;i<10;i++)
{
cin>>b[i];
if(b[0]==-1)
{
break;
}
}
if(b[0]==-1)
{
break;
}
bool flag=1;
for(int i=1;i<10;i++)
{
if(!f(b[i],b[i-1]))
{
flag=0;
break;
}
}
if(flag)
{
cout<<"YES"<<endl;
}
if(!flag)
{
cout<<"NO"<<endl;
}
}
}
bool f(int x,int y)
{
S ss1,ss2;
for(int i=0;i<10;i++)
{
if(x==s[i].num)
{
ss1=s[i];
}
if(y==s[i].num)
{
ss2=s[i];
}
}
int one_num1=0;
int one_num2=0;
string str;
for(int i=0;i<7;i++)
{
if(ss1.a[i]=='1')
{
one_num1++;
}
if(ss2.a[i]=='1')
{
one_num2++;
}
if(ss1.a[i]==ss2.a[i])
{
str[i]='0';
}
if(ss1.a[i]!=ss2.a[i])
{
str[i]='1';
}
}
if(one_num1==one_num2&&ss1.a!=ss2.a)
{
return 0;
}
else if(one_num1==one_num2&&ss1.a==ss2.a)
{
return 1;
}
else if(one_num1<one_num2)
{
for(int i=0;i<7;i++)
{
if(ss1.a[i]!=str[i])
{
ss1.a[i]='1';
}
}
if(ss1.a!=ss2.a)
{
return 0;
}
else
{
return 1;
}
}
else
{
for(int i=0;i<7;i++)
{
if(ss2.a[i]!=str[i])
{
ss2.a[i]='1';
}
}
if(ss1.a!=ss2.a)
{
return 0;
}
else
{
return 1;
}
}
}