Power Calculus UVA - 1374 迭代加深搜索
Posted fan-jiaming
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Power Calculus UVA - 1374 迭代加深搜索相关的知识,希望对你有一定的参考价值。
迭代加深搜索经典题目,好久不做迭代加深搜索题目,拿来复习了,我们直接对当前深度进行搜索,注意剪枝,还有数组要适当开大,因为2^maxd可能很大
题目:题目链接
AC代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cmath> 5 #include <algorithm> 6 #include <cstring> 7 #include <vector> 8 #include <string> 9 #include <queue> 10 #include <map> 11 #include <set> 12 13 #define FRER() freopen("in.txt", "r", stdin); 14 #define INF 0x3f3f3f3f 15 16 using namespace std; 17 18 const int maxn = 10000 + 5; 19 20 int num[maxn], vis[maxn], temp[50], maxd, n; 21 22 bool dfs(int, int); 23 24 int main() 25 { 26 //FRER() 27 ios::sync_with_stdio(0); 28 cin.tie(0); 29 30 temp[0] = 1; 31 for(int i = 1; i < 32; ++ i) 32 temp[i] = temp[i - 1] << 1; 33 while(cin >> n && n) { 34 memset(vis, 0, sizeof(vis)); 35 for(maxd = 0; ; ++maxd) 36 if(dfs(0, 1)) break; 37 cout << maxd << endl; 38 } 39 return 0; 40 } 41 42 bool dfs(int cur, int s) { 43 if(cur == maxd && s == n) return true; 44 if(cur > maxd) return false; 45 if(s * temp[maxd - cur] < n) return false; 46 num[cur] = s; 47 vis[s] = 1; 48 for(int i = 0; i <= cur; ++i) { 49 int u = num[i] + s; 50 if(!vis[u]) { 51 vis[u] = 1; 52 if(dfs(cur + 1, u)) return true; 53 vis[u] = 0; 54 } 55 u = abs(num[i] - s); 56 if(!vis[u]) { 57 vis[u] = 1; 58 if(dfs(cur + 1, u)) return true; 59 vis[u] = 0; 60 } 61 } 62 vis[s] = 0; 63 return false; 64 }
以上是关于Power Calculus UVA - 1374 迭代加深搜索的主要内容,如果未能解决你的问题,请参考以下文章
Power Calculus UVA - 1374 迭代加深搜索