1057 - Collecting Gold

  PDF (English) Statistics Forum
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 }
时间: 2024-10-04 06:24:10

1057 - Collecting Gold的相关文章

lightoj 1057 - Collecting Gold(状压dp)

题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1057 题解:看似有点下记忆话搜索但是由于他是能走8个方向的也就是说两点的距离其实就是最大的x轴或y轴的差.然后只有15个藏金点状压一下加dfs就行了. #include <iostream> #include <cstring> #include <cstdio> #include <cmath> #define inf 0X3f3f3f

1057 - Collecting Gold (状态压缩DP)

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

Collecting Gold LightOJ - 1057

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

LeetCode 1219. Path with Maximum Gold

原题链接在这里:https://leetcode.com/problems/path-with-maximum-gold/ 题目: In a gold mine grid of size m * n, each cell in this mine has an integer representing the amount of gold in that cell, 0 if it is empty. Return the maximum amount of gold you can colle

LOL 术语

参考:http://guides.gamepressure.com/lol/guide.asp?ID=22190 ad:Attack Damage,物理攻擊.物理傷害 AA: (Auto Attack) ,右键点击目标,将会使你的角色进入自动攻击状态. afk:Away From Keyboard,人不在電腦前.暫時離開,掛網 aoe:Area of Effect,範圍傷害.範圍攻擊的意思 ap:Ability Power,魔法攻擊.法術傷害 ARM/Armor:物理防禦.護甲,減輕所受到的物理

1057: 有假币

  1057: 有假币 时间限制(普通/Java):1000MS/10000MS   运行内存限制:65536KByte 总提交: 2844       测试通过:773 描述 居然有假币!!!  事情是这样的,现在猪肉涨了,但是农民的工资却不见涨啊,没钱怎么买猪肉啊.渊子这就去买猪肉,结果找来的零钱中有假币!!!可惜渊子一不小心把它混进了一堆真币里面去了.现在知道假币的重量比真币的质量要轻.给你一个天平,请用最快的时间把那个可恶的假币找出来. 输入 1≤n≤230,输入0结束程序. 输出 最少

BZOJ 1057: [ZJOI2007]棋盘制作

Decsription 给你一个矩阵,求最大了 01相间 的矩阵. Sol DP+悬线法. 这是一个论文啊 <浅谈用极大化思想解决最大子矩形问题>--王知昆. 枚举每一根悬线,记录最左/右/上能到达的点,统计答案. Code /************************************************************** Problem: 1057 User: BeiYu Language: C++ Result: Accepted Time:1384 ms Me

Train Herblore Level with 9% off 500M runescape gold shop on RSorder 8.19-8.24

When an employer conducts a background rs3 gold check on their own they will usually only get a hold of information on the location held, dates associated with employment and in case the candidate is entitled to rehire.The very Runescape Grand Switch

CEI.Ensight.Gold.v9.2.1c.Linux64.Redhat 1CD

Spaceclaim v2010 SP1 Win64 1CD 3rd.PlanIt.v9.02.002.2470 1CD IsiPlot.v1.3a 1CD SolidEdge ST3 CHS Win32-ISO 1DVD WaterGEMS V8i 08.11.02.31 1CD Cadence MMSim v10.10.204 Linux 3CD EdgeCAM Part Modeler v2011.R1 1CD Profili.v2.28d 1CD HyperMILL v9.0 SP3 f