【藍(lán)橋杯學(xué)習(xí)記錄】直線
一、題目
在平面直角坐標(biāo)系中,兩點(diǎn)可以確定一條直線。
給定平面上?20 × 21 個(gè)整點(diǎn)?{(x, y)|0 ≤ x < 20, 0 ≤ y < 21, x ∈ Z, y ∈ Z}即橫 坐標(biāo)是?0 到?19 (包含?0 和?19) 之間的整數(shù)、縱坐標(biāo)是?0 到?20 (包含?0 和?20) 之 間的整數(shù)的點(diǎn)。
請(qǐng)問(wèn)這些點(diǎn)一共確定了多少條不同的直線。
二、解題思路
通過(guò)點(diǎn)組合來(lái)計(jì)算非常復(fù)雜,而且對(duì)于線重合的情況不好計(jì)算,如果用四個(gè)點(diǎn)來(lái)計(jì)算,可以循環(huán)(x1,y1),(x2,y2)四個(gè)值,但這要四重循環(huán),且驗(yàn)重用斜率比較好計(jì)算,所以可以直接用點(diǎn)斜式來(lái)計(jì)算,通過(guò)斜率和截距來(lái)驗(yàn)重,點(diǎn)斜式的斜率、截距計(jì)算公式如下:
于是我們先用一個(gè)結(jié)構(gòu)體point來(lái)存儲(chǔ)下所有的點(diǎn),再用一個(gè)map<<k,b>,flag>,鍵表示斜率和截距,值表示是否計(jì)算過(guò)相同的斜率和截距。
這樣,通過(guò)雙重循環(huán)來(lái)循環(huán)結(jié)構(gòu)體,可以達(dá)到組合每個(gè)點(diǎn)的目的。然后再循環(huán)中計(jì)算斜率和截距,并檢查是否之前計(jì)算過(guò)。
三、完整代碼
四、出現(xiàn)問(wèn)題
開(kāi)始結(jié)構(gòu)體中x,y是int類(lèi)型,ans定義的是double類(lèi)型,但是結(jié)果出來(lái)是int類(lèi)型,出現(xiàn)了問(wèn)題。
還有就是知道了一個(gè)新的知識(shí),就是pair類(lèi)型,準(zhǔn)確來(lái)說(shuō)不是一個(gè)類(lèi)型,而是一個(gè)結(jié)構(gòu)體,而且是一個(gè)結(jié)構(gòu)體模板,將<>中的兩個(gè)數(shù)據(jù)組合成一個(gè)數(shù)據(jù),所以用的時(shí)候需要跟模板一樣聲明具體是什么類(lèi)型,然后在傳數(shù)據(jù)的時(shí)候因?yàn)槭墙Y(jié)構(gòu)體,所以可以用{}包起來(lái)兩個(gè)數(shù)據(jù)。就像上邊寫(xiě)的一樣。
還有就是C++標(biāo)準(zhǔn)庫(kù)直到C++11才加入map,所以在編譯時(shí)編譯設(shè)置要加入-std=c++11
