用Python做50道ACM之《土地劃分》

2021-09-26 15:42:27 字數 3749 閱讀 5834

劃分的區塊數=四邊的交點數+中間的交點數-和四邊重疊的邊的邊數

import sys

defcount_lands

(long

,wide,line_num:

'len(position_list)-1'

,line_table)

: sideways=

0 dots=

0for i in

range(1

,line_num+1)

: line1_start=line_table[i][0

] line1_end=line_table[i][1

]if line1_start[1]

>line1_end[1]

:# 總是從高指向低

line1_start,line1_end=line1_end,line1_start

for j in

range

(i+2

,line_num+1)

: line2_start=line_table[j][0

] line2_end=line_table[j][1

]if line2_start[1]

>line2_end[1]

:# 總是從高指向低

line2_start,line2_end=line2_end,line2_start

# 不共邊的情況(必然無交點)if(

(line1_end[1]

+line2_end[1]

)>wide and

(line1_start[0]

+line2_start[0]

)>

long)or

((line1_start[0]

+line1_start[1]

+line2_start[0]

+line2_start[1]

<

long

+wide)

and(line1_end[0]

+line1_end[1]

+line2_end[0]

+line2_end[1]

>

long

+wide)):

pass

# 共兩邊

elif

(line1_start[1]

-line2_start[1]

==0and line1_end[0]

-line2_end[0]

==0)or

(line1_start[0]

-line2_start[0]

==0and line1_end[1]

-line2_end[1]

==0):

if(line1_start[0]

-line2_start[0]

)*(line1_end[1]

-line2_end[1]

)<0or

(line1_start[1]

-line2_start[1]

)*(line1_end[0]

-line2_end[0]

)<0:

dots+=

1# 共一邊

else

:if line1_start[1]

==line2_start[1]

:if line1_end[0]

==0: left_dot,right_dot=line1_start,line2_start

else

: left_dot,right_dot=line2_start,line1_start

if left_dot[0]

>right_dot[0]

: dots+=

1continue

elif line1_end[1]

==line2_end[1]

:if line1_start[0]

==0: left_dot,right_dot=line1_end,line2_end

else

: left_dot,right_dot=line2_end,line1_end

if left_dot[0]

>right_dot[0]

: dots+=

1continue

else

: end_y=

min(line1_end[1]

,line2_end[1]

) start_y=

max(line1_start[1]

,line2_start[1]

)if end_y>start_y:

dots+=

1continue

# 若該邊與矩形四邊重疊:

if(line1_start[0]

==line1_end[0]

and(line1_start[0]

==0or line1_start[0]

==long))

or(line1_start[1]

==line1_end[1]

and(line1_start[1]

==0or line1_start[1]

==wide)):

sideways+=

1return line_num+

1+dots-sideways

line_in_case=

0while

true

: read_in=sys.stdin.readline()if

not read_in:

break

if line_in_case==0:

long

,wide=

tuple([

int(x)

for x in read_in.rstrip(

).split(

' ')])

line_in_case+=1if

long==0

and wide==0:

# 檔案結束標誌

break

elif line_in_case==1:

line_num=

int(read_in.rstrip())

# 線段數

position_list=

# 保持座標的列表

line_in_case+=

1else:[

int(x)

for x in read_in.rstrip(

).split(

' ')])

line_num-=

1if line_num==-1

:# 座標點數量比線段數多一

line_in_case=

0# 開始處理程式

line_table=

# 儲存線段資訊的字典

lands=count_lands(

long

,wide,

len(position_list)-1

,line_table)

print

(lands)

Python 用pyinstrument做效能分析

在計算密集型計算或一些web應用中,我們常常需要對 做效能分析。在python中,最原始的方法即是使用time包中的time函式 該函式以秒為計時單位 from time import sleep,time def func1 sleep 0.001 def func2 sleep 2 begin1...

用Python做科學計算

python是一種物件導向的 動態的程式語言,具有非常簡潔而清晰的語法,既可以用於快速開發程式指令碼,也可以用於開發大規模的軟體,特別適合於完成各種高層任務。隨著numpy,scipy,matplotlib,enthought librarys等眾多程式庫的開發,python越來越適合於做科學計算。...

用python做詞頻統計

假設有乙個本地的txt檔案,想對其進行詞頻統計,可以這樣寫 import time path c users zhangxiaomei desktop walden.txt with open path,r as text words text.read split print words forw...