Collect More Jewels
问题描述
它写在“夫人的书:创世之后,残酷的神摩洛克反抗了造物主马尔杜克的权威。摩尔从马尔杜克那里偷走了众神中所有神器中最强大的一件,也就是叶多尔的护身符,并且他隐藏了它在Gehennom的阴暗洞穴,现在潜伏在他身边的Under World,并且是他的时间。

你的女神女士寻求拥有护身符,并与它一起获得应得的尊荣,胜过其他诸神。

你是一位新接受过训练的漫步者,从出生时就已经成为了女士的乐器。你注定要为你的神祗恢复护身符,或者在企图中死去。你的命运已经到了。为了我们所有人:勇敢地与The Lady一起去!

如果你曾经玩过电脑游戏NETHACK,你必须熟悉上面的引用。如果你从来没有听说过,不要担心。你会很快学会它(并且很喜欢它)。

在这个问题上,你是冒险家,处于危险的地下城。你被告知地牢将崩溃。您必须在给定时间内找到出口楼梯。但是,你不想空手离开地牢。地牢里有很多珍贵的珠宝。在你离开之前尝试收集他们中的一些。一些珠宝更便宜,有些更昂贵。所以你会尽力使你的收藏最大化,更重要的是,要及时离开地下城。

输入
标准输入将包含多个测试用例。输入的第一行是一个整数T(1 <= T <= 10),它是测试用例的数量。接下来是T测试用例,每个测试用例都有一个空白行。

每个测试用例的第一行包含四个整数W(1≤W≤50),H(1≤H≤50),L(1≤L≤1000000)和M(1≤M≤50) = 10)。地牢是一个矩形区域,宽度为W,高度为H。 L是您需要到达出口的时间限制。只要目标区块位于地下城内并且不是墙壁,您就可以移动到每个时间单位上下左右的相邻区块之一。游戏开始时,时间从1开始。 M是地下城里珠宝的数量。一旦冒险家在这个街区,珠宝就会被收集起来。这不会花费额外的时间。

下一行包含M个整数,这是珠宝的值。

接下来的H行将包含W个字符。他们用下列符号表示地牢地图:

[*]标志着一堵墙,你无法移动;
[。]标记一个空的空间,你可以在其中移动;
[@]标志着冒险家的初始位置;
[<]标记出口楼梯;
[A] - [J]标志着珠宝。

输出
结果应该针对标准输出。在一行中以“案例#:”开始每个案例,其中#是从1开始的案例编号。连续两个案例应该由一个空行分隔。在最后的测试用例之后不应该产生空白行。

如果冒险者可以在规定的时间内到达出口楼梯,可以打印“最好成绩为S”的句子,其中S是他可以沿途收集的珠宝的最大值;否则在单行上打印“不可能”一词。
Sample Input

34 4 2 2
100 200
****
*@A*
*B<*
****4 4 1 2
100 200
****
*@A*
*B<*
****12 5 13 2
100 200
************
*B.........*
*.********.*
*@...A....<*
************

Sample Output
Case 1:
The best score is 200.

Case 2:
Impossible

Case 3:
The best score is 300.
思路:先用bfs预估记。记录点点之间的最短距离。然后再dfs遍历点点。不可以直接遍历图。图太大会直接爆时。我处理的方式是建立dp【】【】【】三维代表xy到第m个点的距离。也可以用dp【】【】【】【】表示点的距离。因为我的m点有专门记录。dfs开始也可以从起始点开始,遍历到结束点后就停止。
代码如下:

import java.util.ArrayDeque;import java.util.Queue;import java.util.Scanner;public class 杭电1044 {static int dx[]= {0,1,0,-1};static int dy[]= {1,0,-1,0};static int x1=0,y1=0,x2=0,y2=0,t=0,w=0,h=0,m=0;//起点  结束点    时间  宽   高  珠宝数量static int score=0;//记录获取的分数static int m1[];//记录珠宝价值static int path=0;//两点之间的最短路径static char mi[][]=new char[50][50];//地图public static void main(String[] args)  {Scanner sc=new Scanner(System.in);int T=sc.nextInt();//测试用例         for(int T1=1;T1<T 1;T1  ){ sc.nextLine();//空格是输入的空格,不是输出的空格w=sc.nextInt();//宽(左右h=sc.nextInt();//高              t=sc.nextInt();//时间m=sc.nextInt();//珠宝数量                m1=new int [m 1];//储存珠宝价值int m2[][]=new int[m 1][2];//存宝物坐标 最后一位存结束点的坐标for(int i=0;i<m;i  ){m1[i]=sc.nextInt();}//珠宝的价值sc.nextLine();for(int i=0;i<h;i  )//输入地图{String a=sc.nextLine();mi[i]=a.toCharArray();}for(int i=0;i<h;i  ){for(int j=0;j<w;j  ){                     if(mi[i][j]=='@') {x1=i;y1=j;mi[i][j]='.';}//记录完这个位置就将他变成普通路径,方便后面计算就只有墙不能走if(mi[i][j]=='<') {x2=i;y2=j;mi[i][j]='.';}//ABCD始有顺序的可以转化为对应int值if('A'<=mi[i][j]&&mi[i][j]<='A' m) {m2[mi[i][j]-'A'][0]=i;m2[mi[i][j]-'A'][1]=j;}//粗存珠宝所在位置。}                }m2[m][0]=x2;m2[m][1]=y2;//记录 xy  到第m个珠宝的价值(前提可以到达)因为前面有数组粗存珠宝坐标    int dp[][][]=new int [h][w][m 1];          if(bfs(x1,y1,x2,y2))//可以到达{                 score=0;boolean jud[]=new boolean[m 1];                   dfs(x1,y1,0,0,jud,m2,dp);                System.out.println("Case " T1 ":");if(T1==T) {System.out.println("The best score is " score ".");}else  {System.out.println("The best score is " score ".");System.out.println();}                }else//不可以到达{                   System.out.println("Case " T1 ":");if(T1==T) {System.out.println("Impossible");}else  { System.out.println("Impossible");System.out.println();}}}        }private static void dfs( int x, int y, int t2,int q, boolean[] jud, int[][] m2, int[][][] dp) {//System.out.println(q);if(x==x2&&y==y2) {if(t2<=t) {if(q>score) {score=q;}}}else if(t2 Math.abs(x-x2) Math.abs(y-y2)>t) {}elsefor(int i=0;i<m 1;i  ){                               if(!jud[i]&&dp[x][y][i]!=-1){  if(dp[x][y][i]==0)//没有初始过{ if(bfs(x,y,m2[i][0],m2[i][1])) {jud[i]=true;dp[x][y][i]=path;//dfs(m2[i][0],m2[i][1],t2 path,q m1[i],jud,m2,dp);                 jud[i]=false;}else {dp[x][y][i]=-1;//已经标记不能走}                       }else //前面已经记录过,不需要重复bfs{jud[i]=true;dfs(m2[i][0],m2[i][1],t2 dp[x][y][i],q m1[i],jud,m2,dp);                 jud[i]=false;}}}}private static boolean bfs( int a1, int b1, int a2, int b2) {path=0;Queue<zuobiao> q1=new ArrayDeque();q1.add(new zuobiao(a1,b1,0));if(Math.abs(a1-a2) Math.abs(b2-b1)>t) {return false;}if(Math.abs(a1-x2) Math.abs(y2-b1)>t) {return false;}boolean b[][]=new boolean[h][w];b[a1][b1]=true;while(!q1.isEmpty()){zuobiao zuo=q1.poll();int x=zuo.x;int y=zuo.y;if(x==a2&&y==b2) {if(zuo.time<=t) {path=zuo.time;return true;}}else           for(int i=0;i<4;i  ){if(x dx[i]>=0&&x dx[i]<h&&y dy[i]>=0&&y dy[i]<w)//不出届{if(mi[x dx[i]][y dy[i]]!='*'&&!b[x dx[i]][y dy[i]])//可以移动  时间{if(zuo.time 1 Math.abs(y dy[i]-y2) Math.abs(x dx[i]-x2)<=t){q1.add(new zuobiao(x dx[i],y dy[i],zuo.time 1));b[x dx[i]][y dy[i]]=true;}}}}                }return false;      }static class zuobiao{int x;int y;int time;int value;public zuobiao(int x,int y,int time){this.x=x;this.y=y;this.time=time;}}}

杭电1044java实现dfs bfs相关推荐

  1. 杭电1241java实现dfs

    问题描述 GeoSurvComp地质调查公司负责检测地下油藏. GeoSurvComp一次与一个大的矩形区域一起工作,并创建一个网格,将网格划分为多个方块.然后分别分析每个地块,使用传感设备确定该地块 ...

  2. 杭电1180java实现(bfs)

    诡异的楼梯: 多组数据输入M N,表示大小然后输入地图.*表示墙壁,'.'表示可以通过,S初始,T结尾位置,'-','|'代表初始楼梯状况,每隔一秒就会换成对方.-左右走,跳过楼梯,|上下走,跳过楼梯 ...

  3. 杭电1010java实现dfs

    题目: 问题描述 小狗在一个古老的迷宫中发现了一块骨头,这让他着迷了很多.然而,当他拾起它时,迷宫开始动摇,小狗可能感觉到地面下沉.他意识到骨头是一个陷阱,他拼命地试图走出这个迷宫. 迷宫是一个大小为 ...

  4. 杭电毕业bg dfs

    思路:这个就是01背包问题差不多.先按持续时间排序.在dfs 这样想 第一场排队 要还是不要,第二场要还是不要,一直到最后一场求出最优解. 毕业bg Problem Description 每年毕业的 ...

  5. 杭电1043java实现bfs一遍

    题目Eight Problem Description 这个15难题已经存在了100多年了,即使你不知道它的名字,你也看到了.它由15个滑动瓦片构成,每个滑动瓦片的数量从1到15,并且全部装入4乘4帧 ...

  6. 杭电1430康托 bfs(java)

    魔板: Problem Description 在魔方风靡全球之后不久,Rubik先生发明了它的简化版--魔板.魔板由8个同样大小的方块组成,每个方块颜色均不相同,可用数字1-8分别表示.任一时刻魔板 ...

  7. 杭电1254java实现(双bfs 优先队列)

    推箱子 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不能拉箱子,因此如果箱子被推到一个 ...

  8. 杭电oj1072java实现bfs

    Nightmare 问题描述 伊格内修斯昨晚有一场噩梦.他发现自己身陷迷宫,身上有一枚定时炸弹.迷宫有一个出口,在炸弹爆炸之前,伊格内修斯应该走出迷宫.炸弹的最初爆炸时间设定为6分钟.为了防止炸弹爆炸 ...

  9. POJ2308连连看dfs+bfs+优化

    DFS+BFS+MAP+剪枝 题意:       就是给你一个10*10的连连看状态,然后问你最后能不能全部消没? 思路:      首先要明确这是一个搜索题目,还有就是关键的一点就是连连看这个游戏是 ...

最新文章

  1. 论坛报名 | 数理基础:人工智能的重大理论挑战和最新成果
  2. Ant编译编译APK、打包打包JS
  3. 成都计算机职业学院排名,成都计算机职高排名
  4. network setup service启动后自动停止_一个简单的测试环境下的自动化部署方案
  5. QQ摘录 “废了!”
  6. WPF遍历当前容器中某种控件的方法
  7. .NET微服务体系结构中为什么使用Ocelot实现API网关
  8. python dict hash_【python-dict】dict的使用及实现原理
  9. MySQL对浮点数设置保留位数
  10. 输入函数的区别C++
  11. Eclipse无法查看Servlet源代码的解决方案
  12. GOF-23种设计模式UML图
  13. c语言 文学研究助手 源程序,数据结构文学研究助手
  14. 机器学习和深度学习资料汇总【02】
  15. java,判断一个整数是质数还是合数.
  16. cin、cout、cerr、clog用法区别及其在VS环境下的重定向
  17. GPS跟踪载波环matlab代码,GPS接收机载波跟踪环路解决方案
  18. MNL——多项Logit模型学习笔记(二)
  19. 当代超吸金的行业“Python工程师”,如何快速从Pytho入门到初级Python工程师?
  20. 深入理解SimpleChannelInboundHandler

热门文章

  1. 百度超级链XChain(7)数据模型
  2. Device is not certified by Google
  3. MySQL基本操作(表,字段)
  4. FileLocatorPro正则表达式批量搜索文件中的字符串
  5. 关闭生成调试信息和嵌入清单
  6. 从Github一开源项目ADSEC【学习域渗透攻防基础】
  7. 你知道吗,NukeSped 通过 Bundlore 发起了一种新型攻击
  8. MySQL创建用户(CREATE USER)
  9. 14、修改字符集步骤详解
  10. Python小技巧——快速给大量文件命名