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 ... 
随机推荐
- URLDNS分析
			学习了很久的Java基础,也看了很多的Java反序列化分析,现在也来分析学习哈最基础的URLDNS反序列化吧. Java反序列化基础 为了方便数据的存储,于是乎有了现在的Java序列化于反序列化.序列 ... 
- js获取中国省市区,省市筛选、省市、省市筛选联动。【C#】【js】
			<style type="text/css"> .labelhide { -webkit-box-shadow: 0px 1px 0px 0px #f3f3f3 !im ... 
- 12 — springboot集成JPA — 更新完毕
			1.什么是jpa? 一堆不想整在这博客里面的理论知识.这些理论玩意儿就应该自行领悟到自己脑海里 1).JPA & Spring Data JPA 1.1).JPA JPA是Java Persi ... 
- RAC中常见的高级用法-bind方法
			RAC操作思想: Hook(钩子)思想 RAC核心方法:bind bind方法 假设想监听文本框的内容,并且在每次输出结果的时候,都在文本框的内容拼接一段文字" ... 
- tomcat 之  session服务器 (memcache)
			#: 在tomcat各节点安装memcached [root@node1 ~]# yum install memcached -y #: 下载tomcat所需的jar包(此处在视频中找软件) [roo ... 
- vue2 中的 export import
			vue中组件的引用嵌套通过export import语法链接 Nodejs中的 export import P1.js export default { name: 'P1' } index.js i ... 
- 基于阿里云 ecs 使用 docker 方式部署 showDoc
			官网文档:https://www.showdoc.cc/help?page_id=65610 (建议先看下这个) 首先说明一下,我 ecs 镜像是 CentOS 7.6 64位 1. 首先在 服务器上 ... 
- scanf("%c\n",&a)和scanf("%c",&a)区别
			scanf("%c",&a); 当输入字符的时候,我们按下任意字符 + 回车的时候,回车没有被当作为分隔符,而是作为一个转义字符与输入的字符一起保存在缓存区.第一次scan ... 
- HashMap的putAll方法介绍说明
			jdk1.8 使用putAll时,新map中的值仅为旧map值所对应对象的引用,并不会产生新对象. 如下,使用for循环赋值! public void putAll(Map<? extends ... 
- 离散数学3.1&&3.3
			离散数学 当前所使用的数字电脑是离散的,二进制指令,传输到内存 早先使用的模拟电脑是连续的 判断是否是命题(两个步骤)[不要跳步骤] 陈述句 要么是真命题要么是假命题 真假性 真:用T或1表示,假:用 ... 
