【HDU1198】Farm Irrigation(回溯+记忆化搜索)

数据流小,深搜即可。有些暴力。看其他人的题解用二维转换成一维做的并查集很巧妙,马上去研究一下!!

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cstdio>
 5 #include <cmath>
 6 #include <cctype>
 7 #include <algorithm>
 8 #include <numeric>
 9 #include <string>
10 #include <limits.h>
11 #include <map>
12 using namespace std;
13
14 int m, n, ans = 0;
15 char Map[55][55];
16 bool vis[55][55];
17 map<char, string> check;
18
19 void dfs (int x, int y) {
20
21     vis[x][y] = 1;
22
23     if (check[Map[x][y]].find("U") != -1 && check[Map[x - 1][y]].find("D") != -1) {
24         if (!vis[x - 1][y]) dfs (x - 1, y);
25     }
26
27     if (check[Map[x][y]].find("D") != -1 && check[Map[x + 1][y]].find("U") != -1) {
28         if (!vis[x + 1][y]) dfs (x + 1, y);
29     }
30
31     if (check[Map[x][y]].find("L") != -1 && check[Map[x][y - 1]].find("R") != -1) {
32         if (!vis[x][y - 1]) dfs (x, y - 1);
33     }
34
35     if (check[Map[x][y]].find("R") != -1 && check[Map[x][y + 1]].find("L") != -1) {
36         if (!vis[x][y + 1]) dfs (x, y + 1);
37     }
38 }
39
40 int main () {
41
42     check[‘A‘] = "UL";  check[‘B‘] = "UR";  check[‘C‘] = "DL";
43     check[‘D‘] = "DR";  check[‘E‘] = "UD";  check[‘F‘] = "LR";
44     check[‘G‘] = "ULR"; check[‘H‘] = "UDL"; check[‘I‘] = "DLR";
45     check[‘J‘] = "UDR"; check[‘K‘] = "UDLR";
46
47     while (~scanf("%d%d", &m, &n)) {
48         if (m < 0 && n < 0) {
49             break;
50         }
51         memset (vis, 0, sizeof(vis));
52         memset (Map, 0, sizeof(Map));
53         for (int i = 0; i < m ; ++ i) {
54             for (int j = 0 ; j < n; ++ j) {
55                 cin >> Map[i][j];
56             }
57         }
58         ans = 0;
59         for (int i = 0; i < m; ++ i) {
60             for (int j = 0; j < n; ++j) {
61                 if (vis[i][j] != 1) {
62                     dfs (i, j);
63                     ans ++;
64                 }
65             }
66         }
67
68         cout << ans << endl;
69     }
70     return 0;
71 }

【HDU1198】Farm Irrigation(回溯+记忆化搜索)

时间: 2024-11-09 00:38:44

【HDU1198】Farm Irrigation(回溯+记忆化搜索)的相关文章

bzoj 1589: [Usaco2008 Dec]Trick or Treat on the Farm 采集糖果【tarjan+记忆化搜索】

对这个奇形怪状的图tarjan,然后重新连边把图变成DAG,然后记忆化搜索即可 #include<iostream> #include<cstdio> using namespace std; const int N=100005; int n,a[N],h[N],cnt,dfn[N],low[N],tot,s[N],top,bl[N],si[N],col,mp[N]; bool v[N]; struct qwe { int ne,to; }e[N]; int read() { i

P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 记忆化搜索dfs

题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定奶牛必须遵循的穿越路线来确保奶牛的乐趣.为了实现这个让奶牛在牛棚里来回穿梭的方案,FJ在第i号隔间上张贴了一个“下一个隔间”Next_i(1<=Next_i<=N),告诉奶牛要去的下一个隔间:这样,为了收集它们的糖果,奶牛就会在牛棚里来回穿梭了. FJ命令奶牛i应该从i号隔间开始收集糖果.如果一只奶牛回到某

Doing Homework---hdu1074(状态压缩&amp;&amp;记忆化搜索)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 有n(n<=15)门课需要做作业,每门课所需时间是used_time以及每门课作业上交的最后期限是deadline,晚交一天扣一分,现在来安排最好的写作业计划,让最终的扣除分数最少:   由于n的取值范围不大所以我们可以枚举除所有的状态进行判断是否是最优的即可,状态数为2^n-1; 我们可以用状态压缩来表示出各种状态:二进制中的第i为为1代表第i门课已经完成了. #include <cstd

CodeForces 374C 记忆化搜索

/*题目*/ 题意:Inna喜欢Dima,所以他希望在一张n * m的 每个单元格印有'D'或者'I'或者'M'或者'A' 的桌子上  尽量多的走出 某个路径 中包含DIMA 这个单词数量最多,必须从'D'开始走,并且'D'只能到'I',然后'I'只能到'M',然后'M'只能到'A',然后'A'只能到'D',这样走, 若走不出DIMA这个单词 输出 poor dima 若存在环的话 输出 poor Inna 否则输出 走的路径中 包含 的最多的DIMA单词数量 他奶奶的 一开始,对于那个判断环的

hdu3555 Bomb (记忆化搜索 数位DP)

http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Submission(s): 7316    Accepted Submission(s): 2551 Problem Description The counter-terrorists found a time

数字三角形——递归、递推、记忆化搜索

数字三角形 描述: 有一个由非负整数组成的三角形,第一行只有一个数,除了最下行之外没个数的左下方和右下方各有一个数. 问题: 从第一行的数开始,每次可以往左下或右下走一格,直到走到最下行,把沿途经过的数全部加起来.如何走才能使得这个和尽量大? 分析: 不难看出此题是一个动态的决策问题:每次有两种选择--左下或右下.如果用回溯法求出所有的可能的路线,就可以从中选出最优的路线.但和往常一样,回溯法的效率太低:一个n层数字三角形的完整路线有2^n条,当n很大时回溯法的速度将让人无法忍受.因此本题讨论用

hdu 1978(记忆化搜索)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1978 How many ways Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2945    Accepted Submission(s): 1727 Problem Description 这是一个简单的生存游戏,你控制一个机器人从一

状压DP+记忆化搜索 UVA 1252 Twenty Questions

题目传送门 1 /* 2 题意:给出一系列的01字符串,问最少要问几个问题(列)能把它们区分出来 3 状态DP+记忆化搜索:dp[s1][s2]表示问题集合为s1.答案对错集合为s2时,还要问几次才能区分出来 4 若和答案(自己拟定)相差小于等于1时,证说明已经能区分了,回溯.否则还要加问题再询问 5 */ 6 /************************************************ 7 * Author :Running_Time 8 * Created Time :

【题解】滑雪 luogu1434 记忆化搜索

记忆化搜索入门题 题目 Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道在一个区域中最长的滑坡.区域由一个二维数组给出.数组的每个数字代表点的高度.下面是一个例子: 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小. 在上面的例