[題解] UVa 12478 - Hardest Problem Ever (Easy)
Tags
- 題解
- UVa
- E難度
略譯
一群優秀的出題者在吵最簡單的題目該怎樣設計
有人拿工作最近遇到的問題,它很容易但是無趣
有人說那太難,我們應該讓參加者都開心,不要零題敗興而歸,應該出 A+B 問題
有人怕新手只會印 hello world 連輸入都不知道怎讀,不應該有輸入
因此,本題沒有輸入,所有東西都是題目上給死的
最後,他們給出一道題目:
給你一個 9x9 的方格,每一格有一個字母,藏著這群出題者的名字
出題者的名字會以一連串直向相鄰或橫向相鄰的方式出現,
沒有斜向,也不能中途轉方向。
但是名字的字母順序可以對調,比如說 WASI 可能以 IAWS 或 SAIW 出現
給你所有出題者的名字,除了某個人以外,每人的名字都在 9x9 方格上恰只出現一次
只有某個人出現了兩次,要你輸出某個人的名字
題解
人眼算完後直接印,結束
先對 9x9 方格和名字建表,再去搜這張表;
為了防止重覆計算,我們從這張表的每一格出發,
只嘗試往右走和往下走,而不要嘗試左或上,不要往兩邊延伸。
對每一格延伸時只讓它當左上角,是相當重要且常見,能減少無謂運算的方式。
這樣很多時候我們從長度可以知道不可行,就能略過。
由於字母順序可以對調,所以重要的就不是字母的順序,
而是每個字母的出現次數。
因此,用每個字母出現次數,來判斷是摻了不存在的字母、某字母過多或者不足,
就能判斷順序可以對調的狀況。
千萬不要把名字所有可能排列方式都弄出來,一個一個拿下去找。
實作提示
- 就算沒有 input,題目給的東西先建表,用陣列存
- 將每一格當左上角試試;
一定有人當左上角,每一格不是當左上角就一定是別人當,
所以當前這一格,如果不讓它當左上角,就一定是別人當左上角時算過的情況,
那就是無謂的運算,還可能重覆計算。 - 字母順序可以對調時不要拿所有排列下去比對;
順序無需考慮時,考慮各字母出現次數 人眼判斷或計算完後,只保留輸出的code不上傳計算的code,跑比較快
cmusu