C 火柴棒問題 深度優先搜尋 剪枝

2021-10-23 06:06:26 字數 2610 閱讀 5471

有乙個由火柴棒作為邊組成的n×n 的格仔。(n≤5)按照下圖,給火柴棒編號。(這是 n=3 的情況,其它情況類似)

這是此圖鏈結

現在將移除某些火柴棒的狀態作為初始狀態,需要再移除一些火柴棒,以保證圖中乙個正方形也沒有。請求出所有需要移除火柴棒的最少根數。

輸入格式

第一行乙個整數 t 表示測試資料個數。

對於每個測試資料,第一行整數 nn ,表示正方形的邊長。第二行以乙個整數 m 開頭(m≤2n(n+1)),接下來 m 個不相同的整數,範圍在 [1,2n(n+1)] 之間,以空格分開。

輸出格式

對每個測試資料,輸出乙個整數表示最少需要移除的火柴棒個數。

輸出時每行末尾的多餘空格,不影響答案正確性

要求使用「檔案輸入輸出」的方式解題,輸入檔案為 matchstick.in,輸出檔案為 matchstick.out

樣例輸入

220

33 12 17 23

樣例輸出

3

3

題解見下,(有注釋),此題用深度優先搜尋+剪枝,**比較的複雜,但我保證我的**時間複雜度很低:

/*

如果移除當前火柴棒後,不能破壞任何正方形,那就沒必要移除.cpp

如果把剩下的火柴棒全部移除,也會留下某些正方形,那後面情況就不用考慮了.cpp

*/#include

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int n=90;

vector<

int>d[n]

;bool belong[n]

[n];

// belong[i][j] 表示火柴棒 i 是否屬於正方形 j.cpp

int mmax[n]

;// mmax[i] 表示正方形 i 最大編號的火柴棒.cpp

int m,ct;

// m 為總的火柴棒數量,ct 為初始正方形數量.cpp

int ans;

// 最終答案.cpp

bool vis[n]

;// 火柴棒初始狀態 true 表示不存在.cpp

// u為當前火柴棒的編號,sum為當前移除的火柴棒數量,state為當前完整正方形的集合.cpp

inthstar

(int u, ll state)

} ps.

push_back

(make_pair

(num,i));

}}sort

(ps.

begin()

, ps.

end())

;int res =0;

vector<

bool

>

used

(m,false);

// 已選集合中是否含有這根火柴棒

for(

int i =

0; i < ps.

size()

; i++)}

if(ok)}}

return res;

}void

dfs(

int u,

int sum,ll state)

if(u==m+1)

return;}

// 初始火柴棒不存在,直接搜下乙個.cpp

if(vis[u]

)int flag=0;

// 0 不用移除 1 可以移除 2 必須移除.cpp

for(ll i=

0;i)else

if(flag==0)

}}if(flag==0)

else

if(flag==2)

}dfs

(u+1

,sum+

1,state);}

else

}dfs

(u+1

,sum+

1,state);}

}int

main()

for(

int sz=

1;sz<=n;sz++)}

/* 對於乙個正方形來講,那 4 個變數是這個正方形上下兩條邊中最左

邊的那根棍,和左右兩條邊中最上邊的那根棍。但是這個正方形肯定不

只這四根棍,這個正方形還有哪些棍呢,就是上下兩條邊往右畫,

左右兩條邊往下畫.cpp

*/if(ok)

ct++;}

}}} ans=

1e6;

dfs(1,

0,(1ll

<);

printf

("%d\n"

,ans);}

return0;

}//好累啊

此題主要還靠你的毅力······我好累······

請給我點點贊或者說說我此博文的不足,謝謝!

深度優先搜尋 回朔 奇偶剪枝

題目描述 題解 基本演算法思路就是深搜,不過會超時,因此得奇數偶數剪枝,就可以ac了。file name dogmaze.cpp 深度優先搜尋加回朔加奇數偶數剪枝 author yyhaker created time 2017 6 1 include include include include...

DFS(深度優先搜尋) (C )

1 演算法用途 用於遍歷圖中的節點,有些類似於樹的深度優先遍歷。這裡唯一的問題是,與樹不同,圖形可能包含迴圈,因此我們可能會再次來到同一節點。2 基本思想 深度優先遍歷圖的方法是,從圖中某頂點v出發 1 訪問頂點v 2 依次從v的未被訪問的鄰接點出發,對圖進行深度優先遍歷 直至圖中和v有路徑相通的頂...

杭電ACM1010 深度優先搜尋 奇偶剪枝

乙個月之前,資料結構看完了深度和廣度搜尋,做這個搜尋題目的時候,總是超時,後來才知道可以進行剪枝可以判斷是否可以在t的時間內到達指定的地點。杭電1010這一題的題目大意是 一條狗進入乙個神奇的迷宮,一秒走乙個空白的地方,狗走過的地方會消失,也就是說狗不能往回走,門在t秒之後開啟,且開啟很短的時間,狗...