搜索-回溯法
进程击序的媛
身体和灵魂,健身与学习,都在路上。
展开
-
天平难题(Mobile Computing, ACM/ICPC Tokyo
1.重点是求子集的代码 for (int l = (s - 1)&s; l > 0; l = (l - 1)&s), 这里通过l可以求出s的所有子集。 可以举一个例子来理解 。 假设s = 1010 1100, 将s的0,2,4,5位抽出是1111 第一次, s-1 = 1010 1011 l = (s-1)&s = 10101000 l的 0,2,4,5位抽出是1110 第二次, l原创 2017-07-08 09:14:47 · 426 阅读 · 0 评论 -
带宽(Bandwidth,UVa 140
本题用回溯法,将已经排列好的节点放在数组a中,并且记录下此时数组a的带宽值,这里的带宽值是作为函数参数传递的,即now_bandwith 如果a中的节点数等于输入的节点数,则此时为一个全排列,如果这个排列的带宽值比已经保存的最小带宽值小,那么保存该排列和带宽值即可。 为了优化代码,这里用到了剪枝的方法,当a中的排列的带宽值已经大于当前保存的最小带宽时,就没必要继续往a中加入元素了,也就不继续递原创 2017-07-07 21:02:46 · 558 阅读 · 0 评论 -
困难的串(Krypton Factor,UVa 129)
回溯法 注意一定要写47行的if(count == n) return;否则递归不会终止 17行的if(q > i) ok = 0 去掉也能ac,不过还是写上逻辑清晰 ,因为可能存在p先到达0但是q没到达i的情况,则两个子串不相邻,我这个算法会出现这种情况,没有学过好的判断相同子串的办法,暂时想到这个了 #include using namespace std; const i原创 2017-07-07 11:11:37 · 288 阅读 · 0 评论 -
素数环(Prime Ring Problem, Uva 524)
回溯法 #include #include #include using namespace std; const int maxn = 16 + 5; int circle[maxn]; int visit[maxn]; int n; bool is_prime(int n) { int k = sqrt((double)n); int ok = 1; for(int i = 2;原创 2017-07-07 09:16:52 · 174 阅读 · 0 评论 -
八皇后问题
参考书籍《算法竞赛入门经典》刘汝佳 设置一个数组int c[maxn] ,c[i] = k 表示第i行第k列放了一个皇后,因此,原问题可以表示为对0-n进行全排列(对于八皇后问题,n是7),在这些排列中筛选出符合条件,即互不攻击的排列放入数组c 那么怎么判断c[cur]是否与当前已经放入的皇后发生冲突呢,这里设置了一个visit[3][maxn*2]的数组,visit[0][i] = 1表示第原创 2017-07-06 21:43:28 · 149 阅读 · 0 评论