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的更多相关文章
- lightoj 1057 - Collecting Gold(状压dp)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1057 题解:看似有点下记忆话搜索但是由于他是能走8个方向的也就是说两点的距离其 ...
- 1057 - Collecting Gold (状态压缩DP)
题目大意: 给你一个矩阵,'x'是你的起始位置, 'g'是宝藏的位置,问最少多少步可以把所有的宝藏取完,并且最后返回起始位置. 注意:没有宝藏的时候输出 0 =================== ...
- lightoj1057 - Collecting Gold (tsp问题)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1057 题目大意:在二维矩阵中,给你一个起点和至多15个的目标点.要你求出从起点出发经过 ...
- LightOJ1057 Collecting Gold(状压DP)
这道题可以想到几点: 整个行程可以看作一次次的行走,每次行走都是用最短的路程从某一非空点到达另外一非空点: 两点间最少的步数是二者x和y坐标差的最大值: 返回原点这个过程,肯定是取完最后一个黄金后直接 ...
- LeetCode 1219. Path with Maximum Gold
原题链接在这里:https://leetcode.com/problems/path-with-maximum-gold/ 题目: In a gold mine grid of size m * n, ...
- 【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 ...
- POJ2096 Collecting Bugs
Time Limit: 10000MS Memory Limit: 64000K Total Submissions: 5090 Accepted: 2529 Case Time Limit: ...
- 【BZOJ-3039&1057】玉蟾宫&棋盘制作 悬线法
3039: 玉蟾宫 Time Limit: 2 Sec Memory Limit: 128 MBSubmit: 753 Solved: 444[Submit][Status][Discuss] D ...
- 【poj2096】Collecting Bugs
题目描述 Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other materia ...
随机推荐
- Spring整合Mybatis报 java.lang.ClassNotFoundException:org.springframework.core.metrics.ApplicationStartup,即:spring的版本过高,采用RELEASE稳定版
1.遇到的问题: 今天在弄spring整合mybatis的时候遇到一个小问题,如图所示: 简单来说:就是我的spring的xml文件没找到,我就奇了怪了,我所有的配置都没问题啊! 我pom.xml配置 ...
- day06 模板层
day06 模板层 今日内容 常用语法 模板语法传值 模板语法之过滤器 模板语法之标签 自定义过滤器.标签.inclusion_tag(BBS作业用一次) 模板的继承(django前后端结合 那么使用 ...
- Hive(一)【基本概念、安装】
目录 一. Hive基本概念 1.1 Hive是什么 1.2 Hive的优缺点 1.3 Hive的架构 1.4 Hive和数据库的区别 二. Hive安装 2.1 安装地址 2.2 Mysql的安装 ...
- 商业爬虫学习笔记day1
day1 一. HTTP 1.介绍: https://www.cnblogs.com/vamei/archive/2013/05/11/3069788.html http://blog.csdn.ne ...
- java 整型
byte(1字节).short(2字节).int(4字节).long(16字节) java中前缀加上0b或者0B就可以写二进制数,前缀加上0就可以写八进制数,前缀加上0x或者0X就可以写十六进制数 一 ...
- Go modules基础精进,六大核心概念全解析(上)
点击一键订阅<云荐大咖>专栏,获取官方推荐精品内容,学技术不迷路! Go 语言做开发时,路径是如何定义的?Go Mudules又为此带来了哪些改变?本文将会全面介绍Go modules六大 ...
- Quartz在.NET中的使用
一.背景 例如需要在某年某月去将数据库的某个数据更新或者同步,又或者是每隔一段时间来执行一部分代码去调用接口,但是又不想人为的手动去执行 针对此类业务可以使用"定时调用任务",市面 ...
- centos k3s部署
目录 一.k3s介绍 二.在线安装 三.离线安装 四.高可用安装 五.配置k3s镜像仓库 六.Kubernetes 仪表盘 七.常用命令 八.参考 一.k3s介绍 1.k3s是一个轻量级的 Kuber ...
- 在写易买网时产生的错误 JSTL标签库中<c:choose></c:choose>不能放JSP页面<!-- -->注释
最近在使用JSTL标签库的<c:choose>标签时候,发现在该标签体中加了JSP的<!-- -->注释时,总是会显示报错信息.错误的信息如下: org.apache.jasp ...
- Python3元组的简介和遍历
一.Python3元组简介 1.1.如何创建一个元组 ''' Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号(),列表使用方括号[]. 元组创建很简单,只需要在括号中添 ...