1057 - Collecting Gold
Time Limit: 2 second(s) Memory Limit: 32 MB

Finally you found the city of Gold. As you are fond of gold, you start collecting them. But there are so much gold that you are getting tired collecting them.

So, you want to find the minimum effort to collect all the gold.

You can describe the city as a 2D grid, where your initial position is marked by an 'x'. An empty place will be denoted by a '.'. And the cells which contain gold will be denoted by 'g'. In each move you can go to all 8 adjacent places inside the city.

Input

Input starts with an integer T (≤ 100), denoting the number of test cases.

Each case will start with a blank line and two integers, m and n (0 < m, n < 20) denoting the row and columns of the city respectively. Each of the next m lines will contain n characters describing the city. There will be exactly one 'x' in the city and at most 15 gold positions.

Output

For each case of input you have to print the case number and the minimum steps you have to take to collect all the gold and go back to 'x'.

Sample Input

Output for Sample Input

2

5 5

x....

g....

g....

.....

g....

5 5

x....

g....

g....

.....

.....

Case 1: 8

Case 2: 4

思路:状态压缩dp;

一开始用状压搜索来写的wa;

这题是个状态压缩dp,dp[i][j],表示在状态i下到j结束的最小的花费,将起始点放入一起状压,因为起点也是终点,那么最后答案就是dp[(1<<cn)-1][cn-1];cn为起始的标号,也是点的个数

还有可以8个方向,那么两个点的最小距离就是x,y两个方向距离中大的那个;

 1 #include<stdio.h>
2 #include<algorithm>
3 #include<stdlib.h>
4 #include<iostream>
5 #include<math.h>
6 #include<string.h>
7 #include<queue>
8 using namespace std;
9 typedef long long LL;
10 char ma[22][22];
11 int __ma[22][22];
12 int dp[1<<16][22];
13 typedef struct node
14 {
15 int x;
16 int y;
17 } ss;
18 ss ans[100];
19 int d(int n,int m,int nn,int mm)
20 {
21 int x = abs(n-nn);
22 int y = abs(m-mm);
23 return max(x,y);
24 }
25 int main(void)
26 {
27 int n,m;
28 int T,__ca=0;
29 scanf("%d",&T);
30 while(T--)
31 {
32 __ca++;
33 int i ,j;
34 //memset(flag,0,sizeof(flag));
35 scanf("%d %d",&n,&m);
36 for(i = 0; i < n; i++)
37 {
38 scanf("%s",ma[i]);
39 }
40 int __n,__m;
41 int cn=0;
42 for(i = 0; i < n; i++)
43 {
44 for(j = 0; j < m; j++)
45 {
46 if(ma[i][j] == 'x')
47 {
48 __n=i;
49 __m=j;
50 }
51 if(ma[i][j]=='g')
52 {
53 ans[cn].x = i;
54 ans[cn].y = j;
55 __ma[i][j] = cn++;
56 }
57 }
58 }
59 int ask=0;
60 for(i = 0; i < (1<<16); i++)
61 {
62 for(j = 0; j < 16; j++)
63 {
64 dp[i][j] = 1e9;
65 }
66 }
67 ans[cn].x = __n;
68 ans[cn].y = __m;
69 __ma[__n][__m] = cn++;
70 dp[0|(1<<(cn-1))][cn-1] = 0;
71 if( cn != 1)
72 {
73 for( i = 0; i <(1<<cn); i++)
74 {
75 for(int x = 0; x < cn; x++)
76 { if(i & (1<<x))
77 for(int y = 0; y < cn; y++)
78 {
79 int di=d(ans[x].x,ans[x].y,ans[y].x,ans[y].y);
80 dp[i|(1<<y)][y] = min(dp[i|(1<<y)][y],dp[i][x]+di);
81 }
82 }
83 }
84 ask=dp[(1<<cn)-1][cn-1];
85 }
86 printf("Case %d: ",__ca);
87 printf("%d\n",ask);
88 }
89 return 0;
90 }

1057 - Collecting Gold的更多相关文章

  1. lightoj 1057 - Collecting Gold(状压dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1057 题解:看似有点下记忆话搜索但是由于他是能走8个方向的也就是说两点的距离其 ...

  2. 1057 - Collecting Gold (状态压缩DP)

    题目大意: 给你一个矩阵,'x'是你的起始位置, 'g'是宝藏的位置,问最少多少步可以把所有的宝藏取完,并且最后返回起始位置. 注意:没有宝藏的时候输出 0   =================== ...

  3. lightoj1057 - Collecting Gold (tsp问题)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1057 题目大意:在二维矩阵中,给你一个起点和至多15个的目标点.要你求出从起点出发经过 ...

  4. LightOJ1057 Collecting Gold(状压DP)

    这道题可以想到几点: 整个行程可以看作一次次的行走,每次行走都是用最短的路程从某一非空点到达另外一非空点: 两点间最少的步数是二者x和y坐标差的最大值: 返回原点这个过程,肯定是取完最后一个黄金后直接 ...

  5. LeetCode 1219. Path with Maximum Gold

    原题链接在这里:https://leetcode.com/problems/path-with-maximum-gold/ 题目: In a gold mine grid of size m * n, ...

  6. 【leetcode】1219. Path with Maximum Gold

    题目如下: In a gold mine grid of size m * n, each cell in this mine has an integer representing the amou ...

  7. POJ2096 Collecting Bugs

    Time Limit: 10000MS   Memory Limit: 64000K Total Submissions: 5090   Accepted: 2529 Case Time Limit: ...

  8. 【BZOJ-3039&1057】玉蟾宫&棋盘制作 悬线法

    3039: 玉蟾宫 Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 753  Solved: 444[Submit][Status][Discuss] D ...

  9. 【poj2096】Collecting Bugs

    题目描述 Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other materia ...

随机推荐

  1. 学习java的第二十二天

    一.今日收获 1.java完全学习手册第三章算法的3.2排序,比较了跟c语言排序上的不同 2.观看哔哩哔哩上的教学视频 二.今日问题 1.快速排序法的运行调试多次 2.哔哩哔哩教学视频的一些术语不太理 ...

  2. MapReduce06 MapReduce工作机制

    目录 5 MapReduce工作机制(重点) 5.1 MapTask工作机制 5.2 ReduceTask工作机制 5.3 ReduceTask并行度决定机制 手动设置ReduceTask数量 测试R ...

  3. Yarn【架构、原理、多队列配置】

    目录 一.什么是yarn 二.yarn的基本架构和角色 三.yarn的工作机制 四.任务提交流程 五.资源调度器 FIFO 容量调度器 公平调度器 六.容量调度器多队列提交案例实操 1.案例:配置de ...

  4. RB-Tree深度探索

    关联式容器就是通过key值来寻找value,这个和数据库很相像,为了提升查找效率,因此关联式容器底层大多数用红黑树或哈希表来实现. 红黑树是高度平衡的二叉树,它也被称为平衡二元搜索树. 如上所示,正常 ...

  5. ORACLE 查询sql和存储性能思路

    1.确定session id 如果是存储过程,在程序开头设置客户端标识.并根据标识获取session id. DBMS_SESSION.set_identifier('XXX'); select * ...

  6. VectorCAST软件自动化测试方案

    VectorCAST 是主要用于对C/C++/Ada程序进行软件自动化测试,并能够在Windows和Linux等多种开发环境下运行.其主要功能包含自动化的单元测试.集 成测试.覆盖率分析.回归测试.代 ...

  7. Apache Log4j 远程代码执行漏洞源码级分析

    漏洞的前因后果 漏洞描述 漏洞评级 影响版本 安全建议 本地复现漏洞 本地打印 JVM 基础信息 本地获取服务器的打印信息 log4j 漏洞源码分析 扩展:JNDI 危害是什么? GitHub 项目 ...

  8. 有个性的手动计划模式(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 任务工作表里默认的标题"工期"."开始时间"."结束时间"这些 ...

  9. M-SOLUTIONS Programming Contest 2020 题解

    M-SOLUTIONS Programming Contest 2020 题解 目录 M-SOLUTIONS Programming Contest 2020 题解 A - Kyu in AtCode ...

  10. CF200B Drinks 题解

    Content 有 \(n\) 杯饮料,第 \(i\) 杯饮料中橙汁占 \(a_i\%\).现在请求出这 \(n\) 杯饮料混合成一杯饮料后的橙汁所占百分比. 数据范围:\(1\leqslant n\ ...