有乙個由火柴棒作為邊組成的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秒之後開啟,且開啟很短的時間,狗...