數碼管

【問題描述】

液晶數碼管用七筆阿拉數字表示的十個數字,把橫和豎的一 個短劃都稱爲一筆,即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不能相互轉化。

通過上述分析,將採用下面的方法解決相關問題:

  1. 將各個數字設置成二進制串:

0="1111110";

1="0110000";

2="1101101";

3 ="1111001";

4="0110011";

5="1011011";

6="1011111";

7="1110000";

8="1111111";

9="1111011";

  1. 設計一個算法查找兩個數字的中的1的位置是否爲包含或者被包含的關係
  2. 利用異或^和位或&的相關性質。

 

  1. 定義一個結構體數組,成員函數爲數字和對應的二進制串。
  2. 定義一個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;
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章