UASCO checker, 不要滿足慣性思維

2021-05-25 11:00:36 字數 2812 閱讀 6623

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年光景。嗟夫!滿 庭 芳 遊黃帝陵 橋山巔峰,巍然陵冢,盤龍靜臥無聲 沮水浩蕩,送萬里長風 中華人文初祖,築台畔,龜虎龍鳳 五千年,民族英魂,鑄華夏同盟。凝眸,靜俯首,寂林幽徑,消暗春愁 祭...

不要錯走路,不要彷徨。

你說你孤獨,就像很久以前長星照耀十三個州府。海子 歌或哭 願中國青年都擺脫冷氣,只是向上走,不必聽自暴自棄者流的話。能做事的做事,能發聲的發聲。有一分熱,發一分光。就令螢火一般,也可以在黑暗裡發一點光,不必等候炬火。此後如竟沒有炬火,我便是唯一的光。魯迅 熱風 我天生不合群。一向話少,時而冷場。有過...