usaco Betsy's Tour
来源:互联网 发布:java mq消息队列 编辑:程序博客网 时间:2024/06/05 05:17
搜索好题!!!
思路:回溯
本题难想的主要是如何剪枝,以提高搜索效率剪枝就是搜索进行时,对不满足条件的结果"剪掉",停止往下搜索做不必要的耗时
对于一条合法的路径,除出发点和目标点外,每个中间点都必然有"一进一出"的过程当搜索到某节点时,考虑与其相邻的节点,如果
(1)四周的节点K,如果只有一个与K相邻的未经过的点,则点K为必经点(2)当当前点周围有两个或以上的符合条件的必经点,则选择任何一条都不能得到解,走进死胡同
(3)当前点周围只有一个必经点,则必须走这个必经点(4)没有必经点,则枚举每一个点,继续搜索
另一个剪枝主要从是否形成孤立的区域考虑,如果行走过程中把路一分为二,那么肯定有一部分再也走不到了,需要剪枝有两种比较容易想的会出现孤立区域的情况:
(1)当前点左右都是已经点,而上下都是未经点(2)当前点上下都是已经点,而左右都是未经点
可以这样想,对于(1),假如中间点是由左边相邻的点扩展而来,因为路径是连续的,所以左边点一定是由当前点有边的点扩展而来,且会形成一个封闭的区域,那么上下的点一个在区域内,一个在区域外,不能同时达到。
参考:byvoid/* ID: daijinq1 PROB:betsy LANG: C++ */#include <iostream>#include <cstdio>using namespace std;#define FOR(i,a,b) for(i = (a); i < (b); ++i)#define FORE(i,a,b) for(i = (a); i <= (b); ++i)#define FORD(i,a,b) for(i = (a); i > (b); --i)#define FORDE(i,a,b) for(i = (a); i >= (b); --i)#define CLR(a,b) memset(a,b,sizeof(a))bool vis[12][12];int n, cnt, N;const int px[4] = {-1, 0, 1, 0}, py[4] = {0, 1, 0, -1};int get_f(int x, int y) { int i, f = 0; FOR(i, 0, 4) if(!vis[x + px[i]][y + py[i]]) ++f; return f;}void dfs(int x, int y, int step) { int i, tox, toy, tx, ty, cntf = 0; if(x == n && y == 1) { if(step == N) ++cnt; return ; } if((!vis[x - 1][y] && !vis[x + 1][y] && vis[x][y + 1] && vis[x][y - 1]) || (vis[x - 1][y] && vis[x + 1][y] && !vis[x][y + 1] && !vis[x][y - 1])) return ; FOR(i, 0, 4) { tx = x + px[i]; ty = y + py[i]; if(vis[tx][ty] || (tx == n && ty == 1)) continue; int f = get_f(tx, ty); if(f == 1) { ++cntf; tox = tx, toy = ty; } if(cntf > 1) return ; } if(cntf == 1) { vis[tox][toy] = true; dfs(tox, toy, step + 1); vis[tox][toy] = false; } else { FOR(i, 0, 4) { tx = x + px[i]; ty = y + py[i]; if(vis[tx][ty]) continue; vis[tx][ty] = true; dfs(tx, ty, step + 1); vis[tx][ty] = false; } }}int main() { freopen("betsy.in", "r", stdin); freopen("betsy.out", "w", stdout); int i, j; scanf("%d", &n); N = n * n; vis[1][1] = true; FORE(i, 0, n + 1) vis[0][i] = vis[n + 1][i] = vis[i][0] = vis[i][n + 1] = true; dfs(1, 1, 1); cout<<cnt<<endl; return 0;}/*Executing... Test 1: TEST OK [0.000 secs, 3052 KB] Test 2: TEST OK [0.000 secs, 3052 KB] Test 3: TEST OK [0.000 secs, 3052 KB] Test 4: TEST OK [0.000 secs, 3052 KB] Test 5: TEST OK [0.000 secs, 3052 KB] Test 6: TEST OK [0.011 secs, 3052 KB] Test 7: TEST OK [0.130 secs, 3052 KB]All tests OK.*/
- usaco Betsy's Tour
- [usaco] 5.4.4 Betsy's Tour
- USACO Section 5.4 Betsy's Tour
- USACO Betsy's Tour 解题报告
- USACO 6.5.3 Betsy's Tour dfs
- USACO Section 5.4 Betsy's Tour - 搜索剪枝
- usaco 5.4 Betsy's Tour(插头DP一条回路)
- *usaco training 5.4.4 Betsy's Tour 题解
- ?|USACO 5.4.4|Betsy's Tour|漫游小镇|插头DP
- 【USACO题库】5.4.4 Betsy's Tour漫游小镇
- Betsy's Tour
- USACO6.5.3 Betsy's Tour(betsy)
- USACO 2.4 cow tour
- USACO Cow Tour
- usaco Canada Tour
- USACO Section 5.4 Canada Tour
- USACO Canada Tour 解题报告
- usaco 5.4.1 Canada Tour
- ACM模板
- 【Log4j】如何让自己的java web工程使用log4j?
- 拓展欧几里德算法
- VC6窗体dll,带热键,自身卸载(源码及教程)
- 黑马程序员__Java中的代理类
- usaco Betsy's Tour
- 关于利用myeclipse开发基于xfire的webservice
- 关于this和super关键字的一点整理
- ubuntu下使用Xdebug
- 蛋疼的NDK r7的NUL文件名bug
- 黑马程序员__Java中的泛型
- 从一道面试题解析static的作用
- 黑马程序员__Java中的注解
- 【EL】EL表达式