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 但很明顯,這樣做太麻煩。乙個較好的方法是使用常量陣列。...