2019 杭電多校第八場 hdu 6660 構造

2021-09-26 05:07:59 字數 1471 閱讀 7124

題意:給你乙個n和乙個m,讓你放置n*m個陷阱,現在讓你構造出一條路徑,使得每個點只走一次,然後本次的位置與上一次的位置的 euclidean distance 要嚴格大於1小於3,這裡 euclidean distance 的計算就是sqrt((x1-x2)^2 +(y1-y2)^2)。

題解:我們經過手推幾組發現當n<2&&m<3的時候,是無法構造出來的n=1&&m=1是特殊情況,之後所有情況都是可以構造出來的,之後我們就採用之字形構造方法,對其進行構造。

1.我們分兩部分進行構造,當行數大於等於3行且列數大於等於3行的時候,當行數為奇數行時從後往前開始構造,列數為奇數從最後乙個位置構造,列數為偶數從倒數第二個位置開始構造;當行數為偶數時從第二個位數開始從前往後構造每位數隔二個距離。根據上面描述構造完成後我們會發現他一定是剛好跳到3 1 這個位置,之後我們就跳到1 1 這個位置後,開始在第二行從二開始往後兩位兩位的構造

構造完成後,在第一行開始我們從後往前開始構造當列數為偶數時候從倒數第二個開始構造,當列數為奇數的時候從倒數第乙個開始構造 構造到第三列這個位置

2. 第二部分我們跑乙個for從1到m 從2 1, 1 2, 2 3 ,1 4開始行數2 1 2 1 2 1 這樣開始構造 列數每次增加1跑到m為止。之後從第3行開始奇數行且奇數列的從倒數第二個開始構造,奇數行偶數列的從最後乙個開始構造 ,當行數為偶數的時候從1開始構造即可

具體實現方法看**實現.

#include.h>

using namespace std;

int flag;

void

dfs1

(int n,

int m)

else

for(

int j=

2;j<=m;j+=2)

} cout<<

"1 1"

int i=

2;i<=m;i+=2)

if(flag)cout<" 2"

"2 "

int i=m&

1?m:m-

1;i>=

3;i-=2)

if(flag)cout<" 1"

"1 "

<}void

dfs2

(int n,

int m)

else

}for

(int i=

3;i<=n;i++

)else}}

intmain()

if(n==

1&&m==1)

if(n<

2||m<3)

cout<<

"yes"

(n,m)

;dfs2

(n,m);}

}

2019杭電多校第八場

感覺慢慢陷入了疲態 依舊是努力簽到的一天 1009 calabash and landlord 各種分類討論,交上去,wa,造資料,找到bug,改一改,交上去,wa,造資料,改一改,wa,改一改,wa 迴圈多次後ac,然後自己也不知道自己寫的是個啥了。後來聽群裡老哥們說只要離散化到5 5的格仔裡然後...

杭電多校第八場

1003 題目鏈結 clockwise or counterclockwise 水題,經歷過牛客應該知道叉積可以判斷順逆時針。叉積參考 叉積 參考 include include include include include include include include include incl...

杭電多校2020第八場

isomorphic strings 題意 兩個字串s,t互為cyclical isomorphic,當且僅當s將前x個字元移到末尾後,s與t想等,例如s abcde,t deabc,那麼s和t互為cyclical isomorphic。給定乙個s串,長度為n,k為n的因子,現在將s分成k個等長的字...