題目描述:
小藍要用七段碼數碼管來表示一種特殊的文字。
上圖給出了七段碼數碼管的乙個圖示,數碼管中一共有 7 段可以發光的二
極管,分別標記為 a, b, c, d, e, f, g。
小藍要選擇一部分二極體(至少要有乙個)發光來表達字元。在設計字元
的表達時,要求所有發光的二極體是連成一片的。
例如:b 發光,其他二極體不發光可以用來表達一種字元。
例如:c 發光,其他二極體不發光可以用來表達一種字元。這種方案與上
一行的方案可以用來表示不同的字元,儘管看上去比較相似。
例如:a, b, c, d, e 發光,f, g 不發光可以用來表達一種字元。
例如:b, f 發光,其他二極體不發光則不能用來表達一種字元,因為發光
的二極體沒有連成一片。
請問,小藍可以用七段碼數碼管表達多少種不同的字元?
答案:80
思路:
(覺得我囉嗦的可以直接看**,有詳細注釋,還是挺好理解的)
大體思路並不難,分成兩部分:一部分是遍歷所有情況,第二部分是檢查某種情況下是否連通。遍歷比較簡單,難點就在於如何檢查連通。可以用並查集,不過我看別人弄的也挺複雜的,就沒用並查集。(雖然我寫的也挺複雜,,)
方便起見,把a,b,c,d,e,f這七段轉換成0,1,2,3,4,5,6。像這樣:
可以用字串陣列來儲存連通的情況,比如str[1]=「026」。
用陣列表示每個邊的亮滅情況,索引代表邊,1代表亮,0代表滅。
string str[7];
int arr[7] = ;
void init()
然後怎麼判斷連通呢?我最初(其實不是)想的是:遍歷 arr,儲存所有值為 1 的索引到 v 中,然後再遍歷v中的每乙個索引i,在其餘值為1的索引所對應的 str 中找 i,如果其中有乙個找到,就說明整個是連通的,如果都沒有找到,就是不連通的。
這麼想乍看沒什麼問題,但是執行結果是83。說明還有情況沒有考慮到。我對著所有判斷為連通的字串乙個乙個找,終於發現了其他情況。就是0 1 亮,3 4滅。這種情況會被判斷為連通。
這種情況的特徵是:有多個邊只被找到了一次。而正常連通的情況下,最多隻會有兩個邊只被找到一次。按照這種思路修改**,終於對了。
感想:有我思考+寫**+除錯的時間都夠我乙個乙個數數5遍以上了,總共也就不超過128種,考試遇到這種填空題完全可以乙個乙個地數,不放心還能多數幾遍,寫**很容易漏掉某些情況,反而容易錯。。。。
完整**:
#include using namespace std;
string str[7]; //儲存與第i段連通的邊
int arr[7] = ; //表示每段的亮滅,1表示亮,0表示滅
void init() //初始化str
bool check() //檢查arr確定是否連通
}if (s.length() == 0)
return false;
if (s.length() == 1)
return true;
vectorv; //儲存每個邊被找到的次數
for (int i = 0; i < s.length(); i++)
}if (num == 0)
return false;
v.push_back(num);
}int count = 0; //被找到次數為1的邊的個數
for (auto i : v)
if (count > 2)
return false;
return true;
}string tostring(int n) //十進位制轉成7位二進位制字串
return s;
}int fun()
if (check())
}return ans;
}int main()
藍橋杯 七段碼
小藍要用七段碼數碼管來表示一種特殊的文字。上圖給出了七段碼數碼管的乙個圖示,數碼管中一共有 7 段可以發光的二極體,分別標記為 a,b,c,d,e,f,g。小藍要選擇一部分二極體 至少要有乙個 發光來表達字元。在設計字元的表達時,要求所有發光的二極體是連成一片的。例如 b 發光,其他二極體不發光可以...
藍橋杯 七段碼 並查集
今天學到了乙個新的演算法 並查集 不得不說 太好用惹!嗷!所以先來復盤一下並查集的思路 我在網上找了乙個很生動的解釋,講的非常好,又能聽懂知識點,又能記得牢,附上原博連線 這是個鏈結 他是以武林為例講的並查集,並查集的作用呢,就是看乙個圖里的連通分支有幾個,如果是乙個,就代表連通圖 如果是兩個,就要...
七段碼(藍橋杯真題) python求解
題目如下 小藍要用七段碼數碼管來表示一種特殊的文字。上圖給出了七段碼數碼管的乙個圖示,數碼管中一共有 7 段可以發光的二極體,分別標記為 a,b,c,d,e,f,g。小藍要選擇一部分二極體 至少要有乙個 發光來表達字元。在設計字元的表達時,要求所有發光的二極體是連成一片的。例如 b 發光,其他二極體...