最近剛刷了幾套有關搜尋的題目,我也是初學者,沒什麼經驗,但我也想總結一番,讓自己再加固一下自己對新知識的了解,dfs主要講的是不斷地向下搜尋,用遞迴的方式自己呼叫自己,深搜直到到找出所有答案為止,當然遞迴這種方式是很難讓人理解的,看不清他是怎麼跑的這個迴圈,但我們靜下心來一步一步的去看,也是可以看懂的。
附一道題目:棋盤問題
在乙個給定形狀的棋盤(形狀可能是不規則的)上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請程式設計求解對於給定形狀和大小的棋盤,擺放k個棋子的所有可行的擺放方案c。input
輸入含有多組測試資料。output每組資料的第一行是兩個正整數,n k,用乙個空格隔開,表示了將在乙個n*n的矩陣內描述棋盤,以及擺放棋子的數目。 n <= 8 , k <= n
當為-1 -1時表示輸入結束。
隨後的n行描述了棋盤的形狀:每行有n個字元,其中 # 表示棋盤區域, . 表示空白區域(資料保證不出現多餘的空白行或者空白列)。
對於每一組資料,給出一行輸出,輸出擺放的方案數目c (資料保證c<2^31)。sample input
sample output2 1
#..#
4 4...#
..#.
.#..
#...
-1 -1
#include#include#include#include#includeusing namespace std;
typedef long long ll;
const int maxn=1e6+5;
int dis[maxn];
char vis[110][110];
int n,k,sum=0;
void dfs(int p,int ans)
dis[i]=1;
dfs(p+1,ans+1);
dis[i]=0;
} }dfs(p+1,ans);
}int main()
getchar();
}dfs(1,0);
printf("%d\n",sum);
} }return 0;
}
簡單搜尋 DFS 棋盤問題
description 在乙個給定形狀的棋盤 形狀可能是不規則的 上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請程式設計求解對於給定形狀和大小的棋盤,擺放k個棋子的所有可行的擺放方案c。input 輸入含有多組測試資料。每組資料的第一行是兩個正整數,n k,...
搜尋剪枝DFS
tempter of the bone hdu1010 題意 給乙個圖,找出乙個看能否能在t的時間內從s到達d點 思路 bfs肯定不行,因為bfs找到的是最短時間的路徑,無法對在t時間點到達d點進行判斷 於是才想到了dfs,這個能把所有的情況遍歷一遍的演算法,雖然圖的長寬只有7,但是總是超時,這次終...
DFS搜尋 剪枝
hdu 5952 題意 給出一張無向圖,然後判斷這張圖中一共有多少個不同的大小為s的完全圖 完全圖的頂點數為s個 題目保證每個點的度不大於20。完全圖 n個點兩兩之間都有一條邊的圖叫完全圖。思路 由於頂點個數很少,而且每個點的度數最多是20,所以可以暴力優化,建圖,對於每個s點完全子圖,如果i點在子...