2013年第四届蓝桥杯国赛 九宫重排(HashMap+双BFS优化)
我们把第一个图的局面记为:12345678.
把第二个图的局面记为:123.46758
显然是按从上到下,从左到右的顺序记录数字,空格记为句点。
本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动可以到达。如果无论多少步都无法到达,则输出-1。
123.46758
46758123.
import java.util.ArrayDeque;
import java.util.HashMap;
import java.util.Scanner; public class Main { static Scanner sc = new Scanner(System.in);
static String beg,end;
static int[][] t = {{1,0},{0,1},{-1,0},{0,-1}};
static HashMap<String,Integer> b = new HashMap<String,Integer>();
static class Node{
String a;
int x,s;
public Node(String a,int x,int s) {
this.a=a;
this.x=x;
this.s=s;
}
}
static ArrayDeque<Node> q = new ArrayDeque<Node>(); static int bfs(int bx,int ex) { b.put(end, -1);
if(b.get(beg)!=null) return 0;
b.put(beg, 0);
q.offerLast(new Node(beg,bx,0));
while(q.size()>0) {
String a=q.peekFirst().a;
int x=q.peekFirst().x/3;
int y=q.peekFirst().x%3;
int s=q.peekFirst().s;
q.pollFirst();
for(int i=0;i<4;i++) {
int tx=x+t[i][0];
int ty=y+t[i][1];
if(tx<0||ty<0||tx>=3||ty>=3) continue;
char tt=a.charAt(tx*3+ty);
String ta=a;
ta=ta.replace(tt, '!');
ta=ta.replace('.', tt);
ta=ta.replace('!', '.');
if(b.get(ta)!=null){
if(b.get(ta)==-1) return s+1;
continue;
}
b.put(ta, s+1);
q.offerLast(new Node(ta,tx*3+ty,s+1));
}
}
return -1;
} public static void main(String[] args) { beg = sc.next();
end = sc.next();
int bx=0,ex=0;
for(int i=0;i<9;i++) {
if(beg.charAt(i)=='.'){
bx=i;
break;
}
}
for(int i=0;i<9;i++) {
if(end.charAt(i)=='.'){
ex=i;
break;
}
}
System.out.println(bfs(bx,ex));
} }
优化前
import java.util.ArrayDeque;
import java.util.HashMap;
import java.util.Scanner; public class Main { static Scanner sc = new Scanner(System.in);
static String beg,end;
static int[][] t = {{1,0},{0,1},{-1,0},{0,-1}};
static HashMap<String,Integer> bb = new HashMap<String,Integer>();
static HashMap<String,Integer> be = new HashMap<String,Integer>();
static class Node{
String a;
int x,s,m;
public Node(String a,int x,int s,int m) {
this.a=a;
this.x=x;
this.s=s;
this.m=m;
}
}
static ArrayDeque<Node> q = new ArrayDeque<Node>(); static int bfs(int bx,int ex) { if(beg.equals(end)) return 0;
bb.put(beg, 0);be.put(end, 0);
q.offerLast(new Node(beg,bx,0,1));
q.offerLast(new Node(end,ex,0,2));
while(q.size()>0) {
String a=q.peekFirst().a;
int x=q.peekFirst().x/3;
int y=q.peekFirst().x%3;
int s=q.peekFirst().s;
int m=q.peekFirst().m;
q.pollFirst();
for(int i=0;i<4;i++) {
int tx=x+t[i][0];
int ty=y+t[i][1];
if(tx<0||ty<0||tx>=3||ty>=3) continue;
char tt=a.charAt(tx*3+ty);
String ta=a;
ta=ta.replace(tt, '!');
ta=ta.replace('.', tt);
ta=ta.replace('!', '.');
if(m==1){
if(bb.get(ta)!=null) continue;
if(be.get(ta)!=null) return be.get(ta)+s+1;
bb.put(ta, s+1);
}
else{
if(be.get(ta)!=null) continue;
if(bb.get(ta)!=null) return bb.get(ta)+s+1;
be.put(ta, s+1);
}
q.offerLast(new Node(ta,tx*3+ty,s+1,m));
}
}
return -1;
} public static void main(String[] args) { beg = sc.next();
end = sc.next();
int bx=0,ex=0;
for(int i=0;i<9;i++) {
if(beg.charAt(i)=='.'){
bx=i;
break;
}
}
for(int i=0;i<9;i++) {
if(end.charAt(i)=='.'){
ex=i;
break;
}
}
System.out.println(bfs(bx,ex));
} }
优化后
2013年第四届蓝桥杯国赛 九宫重排(HashMap+双BFS优化)的更多相关文章
- 2013年第四届蓝桥杯国赛试题(JavaA组)
1.结果填空 (满分12分)2.结果填空 (满分15分)3.结果填空 (满分10分)4.程序设计(满分16分)5.程序设计(满分20分)6.程序设计(满分27分) 1.标题:填算式 请看下面的算式: ...
- 2013年第四届蓝桥杯省赛试题(JavaA组)
1.结果填空 (满分3分)2.结果填空 (满分5分)3.结果填空 (满分6分)4.结果填空 (满分13分)5.代码填空 (满分5分)6.代码填空 (满分10分)7.程序设计(满分4分)8.程序设计(满 ...
- 第九届蓝桥杯国赛+第二天的第11届acm省赛的总结
第九届蓝桥杯国赛+第二天的第11届acm省赛的总结 25号坐的去北京的火车,10个小时的火车,然后挤了快两个小时的地铁,最终达到了中国矿业大学旁边的订的房间.12个小时很难受,晕车症状有点严重,吃了快 ...
- 带分数--第四届蓝桥杯省赛C++B/C组
第四届蓝桥杯省赛C++B/C组----带分数 思路: 1.先枚举全排列 2.枚举位数 3.判断是否满足要求 这道题也就是n=a+b/c,求出符合要求的abc的方案数.进行优化时,可以对等式进行改写,改 ...
- 2018年第九届蓝桥杯国赛总结(JavaB组)
懒更,之前的删了补一个国赛总结 记yzm10的第一次国赛(赛点:首都经贸大学) 第一次就拿到了国一,运气不要太好~(同组lz学长豪取国特orz) 从省赛一路水过来,总算有了点成绩.其实最后一题有些遗憾 ...
- 2019年第十届蓝桥杯国赛总结(JavaA组)
JavaA组国二,可以报销了~ JA死亡之组可不是盖的,rank12的排名还是拿不到国一啊(只有五个.. 出成绩的一刻波澜不惊,毕竟去年有国一了不慌哈哈哈 不过对我来说这个结果还算意料之外吧,毕竟大三 ...
- 2015年第六届蓝桥杯国赛试题(JavaA组)
1.结果填空 (满分15分)2.结果填空 (满分35分)3.代码填空 (满分31分)4.程序设计(满分41分)5.程序设计(满分75分)6.程序设计(满分103分) 1.标题:胡同门牌号 小明家住在一 ...
- 蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)
Description 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的 ...
- 蓝桥杯OJ PREV-19 九宫重排
题目描写叙述: 历届试题 九宫重排 时间限制:1.0s 内存限制:256.0MB 问题描写叙述 如以下第一个图的九宫格中,放着 1~8 的数字卡片.另一个格子空着.与空格子相 ...
随机推荐
- source In sight 中修改自动补全快捷键方式
点击 “options”中的“key Assi...”,找到如下 点击“Assign New Key...”之后按键盘上的指定按键就能重新设定.
- untra edit 显示文件函数列表
UltraEdit的函数列表竟然不显示函数,那这功能要它何用,应该如何才能让函数显示出来呢? 1:先查看一下UE的菜单:视图-->查看方式(语法高亮类型)-->选择相应的语言(我们用的是C ...
- TIJ摘要:访问控制权限
重构的原动力之一:发现有更好的方式去实现相同的功能. OOP需要考虑的基本问题:如何把变动的事物与不变的事物区分开来. 访问控制权限:以供类库开发人员向客户端程序员指明哪些是可用的,哪些是不可用的.访 ...
- IDEA运行Java的项目出现页面空白
问题效果: 解决方案: 在发布的时候不应该把Tomcat的jar打包入内.
- 使用spring-boot-starter-amqp开发生产者应用
上一篇我们介绍了如何使用spring AMQP和RabbitMQ结合,开发消费者应用程序,使用的是Xml配置的Spring框架. 本篇我们仍然使用Spring AMQP开发生产者应用,不过我们使用零 ...
- AWS + Stunnel + Squid ***
[需求] 第一,能***. 第二,在企业网络要能突破端口限制. [原理] 利用AWS提供的一年免费EC2服务,搭建一台自己的VPS,在VPS中利用Stunnel与本机建立加密连接,将本地http请求通 ...
- 记工作的变化--入住DB
2013年11月1日----一个值得纪念的日子! 今天才是我作为一个劳动者,步入社会的真正开始. 以前一直觉得做技术的技术做好就行了不用在意其余的细节.现实是做人(沟通)比做技术更重要! 以前一直觉得 ...
- Excel向数据库插入数据和数据库向Excel导出数据
为了熟悉java里工作簿的相关知识点,所以找了“Excel向数据库插入数据和数据库向Excel导出数据”的功能来实现. 注意事项:1,mysql数据库: 2,需要导入的jar包有 jxl.jar,my ...
- DAY10-MYSQL表操作
一 存储引擎介绍 存储引擎即表类型,mysql根据不同的表类型会有不同的处理机制 http://www.cnblogs.com/guoyunlong666/p/8491702.html 二 表介绍 表 ...
- C#log4net引入配置文件后,数据库连接找不到并且有很多 未能找到元素“appender”的架构信息
今天用了log4net加入配置信息后,数据库链接的字符串就报错,无法连接数据库.后来发现,只需要调整一下位置就可以了 configSections 节点必须写在 connectionStrings 节 ...