随笔分类 -  回溯

回溯
POJ 2488 A Knight's Journey
摘要:DFS,要求输出字典序最小的,注意扩展方向。# include <cstdio># include <cstring># define N 26 + 5const int dx[] = {-1, 1,-2, 2,-2, 2,-1, 1};const int dy[] = {-2,-2,-1,-1, 1, 1, 2, 2};int p, q, cnt;bool finished;char solu[N][2];char vis[N][N];void dfs(int x, int y){ solu[cnt][0] = x, solu[cnt][1] = y; if (cnt 阅读全文

posted @ 2012-07-22 22:03 getgoing 阅读(220) 评论(0) 推荐(0)

DFS专题 Fire Net
摘要:这道题暴力秒过,以前在ZOJ上见过,当时不会,还以为不剪枝铁定超呢,结果纯暴力就过了。# include <cstdio># include <cstring># define N 4 + 3int n, ans;char g[N][N];bool check(int x, int y){ int i = x; if (g[x][y] != '.') return false; while (i <= n) { if (g[i][y] == 'X') break; else if (g[i][y] == (i-1)*n+y) ret 阅读全文

posted @ 2012-07-19 19:57 getgoing 阅读(256) 评论(0) 推荐(0)

DFS 专题 Tempter of the Bone
摘要:这道题的剪枝:奇偶性,曼哈顿距离类型的。不剪会超时。# include <cstdio># include <cstring>using namespace std;# define N 7 + 3# define ABS(x) (((x)>0)?(x):(-(x)))int si, sj, gi, gj;int n, m, T;char g[N][N];bool vis[N][N];bool finished;const int dir[][2] = {{0,1}, {1,0}, {0,-1}, {-1,0}};void dfs(int x, int y, in 阅读全文

posted @ 2012-07-19 17:32 getgoing 阅读(174) 评论(0) 推荐(0)

DFS 专题 Accepted Necklace
摘要:这道题如果用 DFS 必须剪枝:剪掉重复的组合。DFS 枚举了所有的排列,实际上这道题只需要组合。View Code # include <cstdio># include <cstring># define N 20 + 5int ans;int n, k, vMax, v[N], w[N];bool vis[N];void dfs(int cur, int sum, int cnt, int weight){ if (weight > vMax) return ; if (cnt == k) ans = (sum > ans ? sum : ans); 阅读全文

posted @ 2012-07-19 17:02 getgoing 阅读(184) 评论(0) 推荐(0)

DFS 专题 Beat
摘要:HINT 误导人,水题。View Code # include <cstdio># include <cstring># define N 15 + 5int n, ans;int f[N][N];bool vis[N];void dfs(int cur, int cnt, int t){ if (cnt > ans) ans = cnt; for (int i = 0; i < n; ++i) if (vis[i] == false && f[cur][i] >= t) { vis[i] = true; dfs(i, cnt+1, f 阅读全文

posted @ 2012-07-19 16:36 getgoing 阅读(156) 评论(0) 推荐(0)

DFS 专题 N皇后
摘要:DFS 其实会超时的,打表。# include <cstdio># include <cstring># define N 10 + 5int n, ans;int solu[N];bool vis[N];void dfs(int cnt){ if (cnt == n) { ++ans; return ; } bool ok; for (int i = 1; i <= n; ++i) if (vis[i] == false) { ok = true; for (int j = 1; j <= cnt; ... 阅读全文

posted @ 2012-07-19 16:06 getgoing 阅读(219) 评论(0) 推荐(0)

DFS 专题 哈密顿绕行世界问题
摘要:注意:标号后面是两个空格。# include <cstdio># include <cstring># include <algorithm>using namespace std;int n, m, adj[21][3];bool vis[21];int solu[22];void dfs(int cur, int cnt){ int t; for (int i = 0; i < 3; ++i) { t = adj[cur][i]; if (cnt == 20 && t == m) { printf("%d: ... 阅读全文

posted @ 2012-07-19 15:35 getgoing 阅读(425) 评论(0) 推荐(0)

DFS专题 下沙小面的(2)
摘要:这道题目有问题,4WA :注意:对于每组测试,Lele都是在站点0拉上乘客的。最后看了题解,改了初始状态 AC 的。View Code # include <cstdio># include <cstdlib># include <cstring># define N 30 + 5int n, k;int g[N][N], des[N], min;bool vis[N];int cmp(const void *x, const void *y){ return *(int*)x - *(int*)y;}void dfs(int cnt, int u, int 阅读全文

posted @ 2012-07-19 00:16 getgoing 阅读(207) 评论(0) 推荐(0)

DFS专题 Sum It Up
摘要:不含回溯,看了标程后 AC 的,标程的代码很短,处理相同解的方法比较好。View Code # include <cstdio># define N 12 + 5bool find;int t, n, a[N], solu[N];void dfs(int sum, int p, int cnt){ if (sum > t) return ; if (sum == t) { find = true; printf("%d", solu[0]); for (int i = 1; i < cnt; ++i) print... 阅读全文

posted @ 2012-07-18 21:09 getgoing 阅读(246) 评论(0) 推荐(0)

DFS专题 变形课
摘要:有向图的DFS,不能包含回溯,会爆栈的。View Code # include <cstdio># include <cstring># define N 26bool finished, vis[N];char g[N][N];void dfs(int u){ for (int i = 0; i < N; ++i) { if (u != i && g[u][i]) { if (vis[i]) return; if (i == 'm'-'a') {finished = true; return ;} ... 阅读全文

posted @ 2012-07-18 19:53 getgoing 阅读(252) 评论(0) 推荐(0)

DFS专题 Prime Ring Problem
摘要:View Code # include <cstdio># include <cstring># define N 20 + 5char ptab[25] = {0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0};int n, solu[N];bool vis[N];void dfs(int cnt){ if (cnt... 阅读全文

posted @ 2012-07-18 18:40 getgoing 阅读(206) 评论(0) 推荐(0)

ZOJ 1008 Gnome Tetravex
摘要:DFS 题目,剪枝比较重要,这里使用的是把重复的方块只记录一次,用 num[] 保存它的数目。# include <cstdio># include <cstring># define N 25 + 2bool finished;int n, m, t[N][4], num[N], ans[N];void dfs(int cnt){ if (cnt == n*n) {finished = true; return ;} int x = cnt/n + 1, y = cnt%n + 1; int left = cnt, top = cnt+1-n; for (int i 阅读全文

posted @ 2012-07-18 16:57 getgoing 阅读(291) 评论(0) 推荐(0)

UVa 193 - Graph Coloring
摘要:dfs;按照 Staginner 大牛的方法写的,大致思路是:刚开始所有点没有着色,且最终结果至少有一个点被着黑色(一个点时直接着黑色,多个点时,可以任选一个点为黑色,其余点全为白色);枚举这个黑色的点,并且把与它相邻的点都着白色,剩下的可以看作是一个相同的子问题了,因为剩下的点都不与这个黑色的点相邻。最优解满足:每个白色的点至少与一个黑色的点相邻(如果这个点相邻的都是白色,可以把它改为黑色),且每个黑色的点周围都是白色。# include <stdio.h># include <string.h># define N 105int n, m, ans;char g[N 阅读全文

posted @ 2012-07-07 09:44 getgoing 阅读(293) 评论(0) 推荐(0)

HDOJ 2553 N皇后问题
摘要:回溯,看了lrj的白书后写的;一提交,TLE。# include <stdio.h># define MAXN 15int n, ans;char vis[3][MAXN*2+1];void search(int cur);int main(){ while (~scanf("%d", &n)) { if (!n) break; ans = 0; memset(vis, 0, sizeof(vis)); search(0); printf("%d\n", ans)... 阅读全文

posted @ 2012-04-12 10:11 getgoing 阅读(265) 评论(0) 推荐(0)

导航