acwing演算法學習 疑難雜題 剪格仔

2021-10-05 12:36:30 字數 2429 閱讀 4337

1.首先判斷有沒有兩 聯通塊

2.然後搜尋(⚠️ 這裡不是搜尋一筆畫畫完的那種 )

3.dfs

4.列舉每乙個dfs的點的四個方向,都放入s當中

5.再進行一次dfs

6.注意判重,搜過的就不再搜了

搜尋方式

//生成雜湊

#include

#define x first

#define y second

using

namespace std;

typedef

unsigned

long

long ull;

typedef pair<

int,

int> pii;

const

int n =

10,inf =

1e8,p =

131;

//這裡的p做雜湊的時候用,一般是p進製的數,一般取131 或者 13331

int n,m;

//n行 m列

int w[n]

[n];

//存放整個**

bool st[n]

[n];

//表示是否被標記過

int sum,ans = inf;

pii cands[n*n]

;//儲存現在在就緒佇列裡的點的座標

int p[n*n]

;//並查集的時候用

unordered_set hash_table;

//生成雜湊

int dx[4]

=,dy[4]

=;//四個方向

intfind

(int x)

//find函式固定套路

bool

check_connect

(int k)

//檢查剩餘的部分是不是連通塊 k 表示現在用了多少塊}}

if(cnt !=1)

return

false

;return

true;}

bool

check_exists

(int k)

//檢查現在的連通塊是否之前已經搜尋過

if(hash_table.

count

(x))

return

true

; hash_table.

insert

(x);

//否則就插入雜湊值

return

false;}

void

dfs(

int s,

int k)

//s 現有的點的值的和 k 現在有幾個點

return;}

vector points;

for(

int i =

0;i < k;i++);

//把新擴充套件的點加進原來的點裡面

if(k +

1< ans &&

!check_exists

(k +1)

) points.

push_back()

;}}sort

(points.

begin()

,points.

end())

;reverse

(points.

begin()

,points.

end())

;//從大到小

for(

int i =

0; i < points.

size()

;i++

)//在 待選的擴充套件點裡面找到合適的那乙個if(

!i || points[i]

!= points[i -1]

)}intmain()

if(sum %2==

0);dfs

(w[0][

0],1

);}if

(ans == inf) ans =0;

cout << ans << endl;

return0;

}

學習演算法遇到的疑難雜症

1 delete動態陣列 如果delete的時候出現執行時錯誤,可能是之前發生過陣列越界 int main delete a return 0 2 快排 在座標向中靠攏的時候除了比較和當前選中的數的大小外,還要判斷邊界 while i j 3 歸併排序 最後一步合併時,臨時陣列和目標陣列的下標不是同...

演算法學習之基礎題

基礎題之字串 題目 把手放在鍵盤上,稍不注意就會往右錯一位。q會變成w,j會變成k。輸入乙個錯位後敲出的字串,輸出打字員本來想打出的句子。分析 如何進行這樣的變換呢?一種方法是使用if語句或者switch語句,如if c w putchar q 但很明顯,這樣做太麻煩。乙個較好的方法是使用常量陣列。...

演算法學習之基礎題

基礎題之字串 題目 把手放在鍵盤上,稍不注意就會往右錯一位。q會變成w,j會變成k。輸入乙個錯位後敲出的字串,輸出打字員本來想打出的句子。分析 如何進行這樣的變換呢?一種方法是使用if語句或者switch語句,如if c w putchar q 但很明顯,這樣做太麻煩。乙個較好的方法是使用常量陣列。...