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. vc控制台程序关闭事件时的正确处理方式

    百度可以找到很多关于这个问题解决的方法 关键控制台API函数:SetConsoleCtrlHandler 在支持C++ 11以上的编译器中,你可以这么做. SetConsoleCtrlHandler( ...

  2. MapReduce04 框架原理Shuffle

    目录 2 MapReduce工作流程 3 Shuffle机制(重点) 3.1 Shuffle机制 3.2 Partition分区 默认Partitioner分区 自定义Partitioner分区 自定 ...

  3. 基于 Golang 构建高可扩展的云原生 PaaS(附 PPT 下载)

    作者|刘浩杨 来源|尔达 Erda 公众号 ​ 本文整理自刘浩杨在 GopherChina 2021 北京站主会场的演讲,微信添加:Erda202106,联系小助手即可获取讲师 PPT. 前言 当今时 ...

  4. Copy constructor vs assignment operator in C++

    Difficulty Level: Rookie Consider the following C++ program. 1 #include<iostream> 2 #include&l ...

  5. 2.8 GO 参数传递

    简单将GO中参数传递分为三类 数字.字符.字符串等类型 结构体 方法 GO的方法本身就是地址的入口,打印一个方法输出的是这个方法的地址 func test_func(){ //0x488a30 fmt ...

  6. 【Java多线程】线程池-ThreadPoolExecutor

    ThreadPoolExecutor提供了四个构造方法: 我们以最后一个构造方法(参数最多的那个),对其参数进行解释: public ThreadPoolExecutor(int corePoolSi ...

  7. 【Java 基础】 instanceof和isInstance区别详解

    obj instanceof class 也就是说这个对象是不是这种类型, 1.一个对象是本身类的一个对象 2.一个对象是本身类父类(父类的父类)和接口(接口的接口)的一个对象 3.所有对象都是Obj ...

  8. FindUserByPageServlet

    package com.hopetesting.web.servlet;import com.hopetesting.domain.PageBean;import com.hopetesting.do ...

  9. Ajax异步更新网页(使用原生JavaScript)

    一.页面代码 <!DOCTYPE html> <html> <head> <title>MyHtml.html</title> <me ...

  10. Redis哨兵日常维护

    目录 一.日常操作 指定一个从做新主 添加一个从节点 添加一个Setinel节点 一.日常操作 指定一个从做新主 有时候需要将当前主节点机器下线,并指定一个高一些性能的从节点接替 将其它从节点的sla ...