frankly speaking
,第一眼看這個題真沒勁,古董題,
n皇后。不過,第一次提交**之後我明白了,是我自己太沒專研精神了。
n皇后是回溯或者說深度優先搜尋的典範,我就是初學回溯和
dfs時接觸到
n皇后的,所以我飛敲鍵盤寫出了下面的**(這個不是直接提交的**,是後來我測試時用的**,但是演算法當然是一致的),當然,請輕拍。
#include
#include
using
namespace
std;
intx
[100
];// at most 100 queues
intn
,times
,num
;inline
void
init
()inline
intabs
(inta)
inline
bool
check
(intk,
inti
)void
backtrack
(intk)
}else
backtrack(k
+1);}
}}intmain
()return0;
}痛定思痛,要節省時間,我琢磨著三個考慮:空間換時間;位運算提速;擴大剪枝力度甚至拿上構造法這個法寶。其實這個三個基本上也可以統一起來,尤其是構造思路,我最後的**也體現了這一點。先說說構造。見圖說話,這個是很需要抽象思維與建模能力的,以
5*5為例,下面是乙個可能的狀態。
這個狀態有三個限制
——其實也就是構造時可以利用的三個特性:橫豎排唯一,左對角線唯一,右對角線唯一
。可能我們收到回溯、搜尋的思維影響太大了,我們都會假設呈現在我們眼前的是整個棋盤,然後有步驟地去試每個位置,說到這,空間換時間的思路基本成型,我們設定一些標記表示某個位置是否可以放入,而不是如前面的**那樣再去計算,見
inline
bool
check
(intk,
inti
)。這樣當然會提速,不過我總覺得這個
check
用不了多少時間,
check
的時間應該是常數時間,當然,
acm題裡常數時間也有可能要人命;再進一步,如果開乙個
bool
陣列作為標記,不但空間耗費大了不少,檢查陣列的時間開銷也不得不計
——如果你是個追求極致效率的
geek
。那麼就容易想到納入位運算了。用乙個整數的乙個
bit表示是否占領。**我沒專門寫,因為我後面的最終程式也用到了這個思路,這個也不多說,我省點時間力氣說說分步構造
——其實也還是搜尋,待會便知。
接過前面一句話,「可能我們收到回溯、搜尋的思維影響太大了,我們都會假設呈現在我們眼前的是整個棋盤,然後有步驟地去試每個位置」,跳出慣性,我們分步去搞,先看怎麼分步
(how to do)
,再看分步的好處
(why to do)
,最後說說這種比較巧妙的思維如何成為我們的
essential skills
,pongba
老大名言:我們需要的不是相對論,而是想出了相對論的那個大腦!繼續看圖說話。
其實都不用我說話了。接下來看看分步的好處,主要是大量的剪枝與方便使用位運算(這個有點牽強,因為如果按照這個分布的法子來解題,位運算有噱頭的感覺)
,前者,那就是每次放入乙個皇后後,下乙個皇后要再放進來時所有的合法位置已經被算出來了,接下來就是怎麼表示的問題,可能用乙個
std::vector<
int>
來表示更簡潔明瞭,不過遞迴時傳
vector
可能很沒效率,不過估計也可以不計,但我有一種執意要使用位運算的感覺,總感覺會快一些。下面先貼**。
/*id: fairyroad
task:checker
lang:c++
*/#include
using
namespace
std;
ifstream fin
("checker.in"
);ofstream fout
("checker.out"
);const
inttag[21
]=;intn,
flag
,count
;int
res[
15];
inline
intfindbit
(int
num)
returnn+
1;}void
nqueue
(int
row,
intleftdiag
/*left diagonal*/
,int
rightdiag
,int
len)
else
return;}
}else}}
intmain
()其實我這個也不是蠻好的**,現在是真懶了,到這裡,提交一下**,看結果,也算快的了。那就這樣了吧。前面圖中左邊的之前單純的回溯法的時間開銷,後者是使用分部構造後的時間測試。
這個辦法說是構造也不完全正確,但是有構造的思維痕跡在裡面。最後是前面留下來的乙個問題。這種比較巧妙的思維如何成為我們的
essential skills
,這個題目俺只有乙個心得:多懷疑自己的直覺思維或者說慣性思維,對他們保持警惕,這種意識才是「我思故我在」的真實涵義,因為謂語是「思」,不是「信」,就是說,一切有效的觀念,都是從懷疑開始,向可能性敞開。
微博:豆瓣:
Nginx PHP FPM集群不跑滿
伺服器配置架構 硬體 nginx 4核4g,外網200m php fpm 4核4g 8臺 軟體 nginx 1.2.10 php 5.6.30 出現的問題 使用ab進行壓力測試時,壓力測試的結果偏低 1200req s nginx負載以及頻寬都偏低,各php fpm節點占用也偏低,檢視php fpm...
舊作《滿庭芳》
整理書籍資料。翻出了以前寫的東西。僅記錄下來,做孤芳自賞罷。填這首 滿庭芳 時是一九九八年春天。忽晃已有近10年光景。嗟夫!滿 庭 芳 遊黃帝陵 橋山巔峰,巍然陵冢,盤龍靜臥無聲 沮水浩蕩,送萬里長風 中華人文初祖,築台畔,龜虎龍鳳 五千年,民族英魂,鑄華夏同盟。凝眸,靜俯首,寂林幽徑,消暗春愁 祭...
不要錯走路,不要彷徨。
你說你孤獨,就像很久以前長星照耀十三個州府。海子 歌或哭 願中國青年都擺脫冷氣,只是向上走,不必聽自暴自棄者流的話。能做事的做事,能發聲的發聲。有一分熱,發一分光。就令螢火一般,也可以在黑暗裡發一點光,不必等候炬火。此後如竟沒有炬火,我便是唯一的光。魯迅 熱風 我天生不合群。一向話少,時而冷場。有過...