赌场网: CSDN资讯

本文来源:http://www.661ib.com/www_cc929_com/

申博现金网怎么样,APP太软,没有达到软中带硬的状态,无法打通院内院外,无法贯穿诊前、诊中和诊后,无法形成患者-患者,医生-医生,患者-医生的闭环,并与医院与医疗费用支付方连接。2014-12-1110:07:27銆€銆€灏忕背鍑€鍖栧櫒琚寚鎶勮銆€銆€缃戜笂绉板叾涓庝竴鏃ユ湰鍏徃浜у搧鈥滄挒鑴糕€濄€€銆€鍒氬垰鍙戝竷鐨勫皬绫崇┖姘斿噣鍖栧櫒灏卞嵎鍏ヤ簡鎶勮椋庢尝銆傞拡瀵圭綉涓婃寚鍏舵妱琚簡鏃ユ湰鍝佺墝宸存厱杈剧殑鍚岀被浜у搧锛屽皬绫虫柟闈㈠垪涓句簡涓ゆ浜у搧鐨勫澶勪笉鍚屻€傘€€銆€灏忕背鐨勫噣鍖栧櫒涔嬫墍浠ヨ璁や负鎶勮浜嗗反鎱曡揪鐨勫畨涔嬮鍑€鍖栧櫒锛屼竴鏂归潰鏄袱鑰呯殑澶栬鐪嬭捣鏉ユ瘮杈冪浉鍍忥紝鍙﹀涓ゆ浜у搧鐨勫惊鐜璁捐涔..接口方面USB2.0+USB3.0的组合相当实用,HDMI接口输出到电视、显示器可获得更加清晰广阔的视野,蓝牙4.0外接蓝牙耳机、鼠标也相当给力。光纤到户初次布放时,部署至用户接入点,采用楼道分纤盒作为外线工程(OSP,OutsidePlant)与内线工程(ISP,InsidePlant)的界面,后续扩容时采用预制入户缆即插即用,快速开通业务。

  为赛事安全保驾护航  施耐德电气在全球范围内提供的整体解决方案不仅能够帮助体育场馆提高能源和运营管理效率,更为重要的是,为观众提供有力的安全保障。部属单位工业和信息化部工业和信息化部电信研究院中国电子信息产业发展研究院计算机网络处理中心国家无线电监测中心部电子科技情报研究所电子标准化研究所电子产品试验研究所人民邮电报社中国电子报社通信产业报社人民邮电出版社电子工业出版社部电子人才交流中心部电子教育中心部电子国际合作服务中心部软件与集成电路促进中心网络不良信息举报运营商中国电信中国移动中国联通通信厂商中兴通讯亿美软通-移动商务深圳天源迪科爱立信诺基亚西门子通信上海贝尔阿尔卡特华为技术CIOE光通信展摩托罗拉亨通集团大唐电信联想美的空调IBM中国瑞斯康达HP中兴通讯微软(中国)有限公司烽火通信俊知技术中国普天烽火网络UT斯达康安捷伦R&SJDSU长飞突破电气国人通信三星日讯科技虹信通信艾默生阿尔西中利科技集团宇龙博通公司中天科技松下空调帝斯曼迪索新邮通多普达高通诺基亚英特尔科华公司重邮信科展讯通信天宇朗通四方通信科达科技RADVISION通鼎集团大圣光纤华夏未来NEC北电网络思科系统OKWAP罗德与施瓦茨金鹏鼎桥富士通中国日立中国日立信息系统日立数据系统NEC信息系统CA(中国)有限公司飞思卡尔宏正美国模拟器件公司中创信测瑞萨九五领讯通信公司MEI辽宁授权培训中心天玑科技摩卡软件威速科技通信有关单位中国产业网中国产业报协会中国光学光电子行业协会中国邮电咨询设计院中国电子商务协会中国电子企业协会中国电子视像行业协会中国电子商会中国无线电协会中国计算机用户协会中国计算机行业协会中国卫星通信广播电视用户协会中国软件行业协会中国信息产业商会中国光学光电子行业协会中国互联网协会中国通信标准化协会中国移动通信联合会中国通信企业协会中国通信工业协会中国通信学会中国通信标准化协会发改委国资委移动labs科技部地方监管北京天津河北内蒙古山西辽宁吉林黑龙江上海江苏浙江安徽福建江西山东广东海南广西湖北湖南河南重庆四川云南贵州西藏陕西甘肃新疆青海宁夏11月26日,由亿欧主办、优护家协办的“全国首届医院论坛”暨“2016亿欧医疗+互联网医院垂直沙龙”在北京侠客岛联合办公空间成功举办。(来源:中国吉林网)

  最近PokemonGO可谓红遍网络,这一情怀满满的AR手游让许多80后和90后玩家充满期待。那么我们应该用什么来回馈支持我们的用户呢那就是必须,并且一直坚持用户至上的理念,认认真真的倾听用户需求,踏踏实实的做好产品品质,不断完善售后服务体系。  黄河口(东营)国际马拉松于2014年5月1日正式打响,今年升级为全国马拉松锦标赛分站赛,全程42公里,有来自60个国家和地区的30815人参加了盛会。部属单位工业和信息化部工业和信息化部电信研究院中国电子信息产业发展研究院计算机网络处理中心国家无线电监测中心部电子科技情报研究所电子标准化研究所电子产品试验研究所人民邮电报社中国电子报社通信产业报社人民邮电出版社电子工业出版社部电子人才交流中心部电子教育中心部电子国际合作服务中心部软件与集成电路促进中心网络不良信息举报运营商中国电信中国移动中国联通通信厂商中兴通讯亿美软通-移动商务深圳天源迪科爱立信诺基亚西门子通信上海贝尔阿尔卡特华为技术CIOE光通信展摩托罗拉亨通集团大唐电信联想美的空调IBM中国瑞斯康达HP中兴通讯微软(中国)有限公司烽火通信俊知技术中国普天烽火网络UT斯达康安捷伦R&SJDSU长飞突破电气国人通信三星日讯科技虹信通信艾默生阿尔西中利科技集团宇龙博通公司中天科技松下空调帝斯曼迪索新邮通多普达高通诺基亚英特尔科华公司重邮信科展讯通信天宇朗通四方通信科达科技RADVISION通鼎集团大圣光纤华夏未来NEC北电网络思科系统OKWAP罗德与施瓦茨金鹏鼎桥富士通中国日立中国日立信息系统日立数据系统NEC信息系统CA(中国)有限公司飞思卡尔宏正美国模拟器件公司中创信测瑞萨九五领讯通信公司MEI辽宁授权培训中心天玑科技摩卡软件威速科技通信有关单位中国产业网中国产业报协会中国光学光电子行业协会中国邮电咨询设计院中国电子商务协会中国电子企业协会中国电子视像行业协会中国电子商会中国无线电协会中国计算机用户协会中国计算机行业协会中国卫星通信广播电视用户协会中国软件行业协会中国信息产业商会中国光学光电子行业协会中国互联网协会中国通信标准化协会中国移动通信联合会中国通信企业协会中国通信工业协会中国通信学会中国通信标准化协会发改委国资委移动labs科技部地方监管北京天津河北内蒙古山西辽宁吉林黑龙江上海江苏浙江安徽福建江西山东广东海南广西湖北湖南河南重庆四川云南贵州西藏陕西甘肃新疆青海宁夏

这里,有作为技术人必须知道的业界大事。

英语不好的程序员,如何斩获外企 offer?

640?wx_fmt=gif

640?wx_fmt=jpeg

作者 |?channingbreeze

责编 | 胡巍巍

640?wx_fmt=jpeg

小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司。

640?wx_fmt=jpeg

今天他就去一家外企面试了。


640?wx_fmt=jpeg


640?wx_fmt=png

面试前


面试前,小史就收到了中英文的面试邀请。

640?wx_fmt=jpeg

去外企面试,最好要能够和面试官英语对话。小史除了复习算法之外,赶紧练起了口语。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg


640?wx_fmt=png

面试现场


640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

面试官给了小史一个问题。(题目已翻译成中文,请自行脑补英文现场)

题目:我有1到8八个数字,放在一个3x3的九宫格里面,那么会留下一个空格。

640?wx_fmt=jpeg

空格可以和上下左右的数字进行交换,你可以认为空格在移动。如果移动成

640?wx_fmt=jpeg

则游戏胜利。

你需要完成以下2件事情:

1、给出数据结构来描述这个过程。

2、给你一个初始状态,告诉我能不能胜利,并给出如何移动才能胜利。

这有点像咱们中国的华容道游戏。

640?wx_fmt=jpeg


640?wx_fmt=jpeg

640?wx_fmt=jpeg


640?wx_fmt=jpeg

640?wx_fmt=jpeg

小史把他能想到的都写了下来。

import?java.util.LinkedList;
import?java.util.List;

/**
?*?@author?xiaoshi?on?2018/9/8.
?*/

public?class?HuaRongDao?{

????/?定义方向
????public?static?final?int?LEFT?=?1;
????public?static?final?int?RIGHT?=?2;
????public?static?final?int?UP?=?3;
????public?static?final?int?DOWN?=?4;

????/?3x3的九宫格
????private?int[][]?arr;

????/?记录空格的位置
????private?int?x;
????private?int?y;

????/?定义移动的数组
????private?List<Integer>?moveArr?=?new?LinkedList<Integer>();

????/?初始化,数字0代表空格,先遍历,找出空格的位置
????public?HuaRongDao(int[][]?arr)?{
????????this.arr?=?arr;
????????for(int?i=0;?i<arr.length;?i++)?{
????????????for(int?j=0;?j<arr.length;?j++)?{
????????????????if(arr[i][j]?==?0)?{
????????????????????x?=?i;
????????????????????y?=?j;
????????????????}
????????????}
????????}
????}

????/?判断是否可以朝某个方向进行移动
????public?boolean?canMove(int?direction)?{
????????switch?(direction)?{
????????????/?y?>?0才能左移
????????????case?LEFT:
????????????????return?y?>?0;
????????????/?y?<?2才能右移
????????????case?RIGHT:
????????????????return?y?<?2;
????????????/?x?>?0才能上移
????????????case?UP:
????????????????return?x?>?0;
????????????/?x?<?2才能下移
????????????case?DOWN:
????????????????return?x?<?2;
????????}
????????return?false;
????}

????/?朝某个方向进行移动,该函数不作判断,直接移动
????/?调用前请自行用canMove先行判断
????public?void?move(int?direction)?{
????????int?temp;
????????switch?(direction)?{
????????????/?空格和左侧数字交换
????????????case?LEFT:
????????????????temp?=?arr[x][y?-?1];
????????????????arr[x][y?-?1]?=?0;
????????????????arr[x][y]?=?temp;
????????????????y?=?y?-?1;
????????????????break;
????????????/?空格和右侧数字交换
????????????case?RIGHT:
????????????????temp?=?arr[x][y?+?1];
????????????????arr[x][y?+?1]?=?0;
????????????????arr[x][y]?=?temp;
????????????????y?=?y?+?1;
????????????????break;
????????????/?空格和上方数字交换
????????????case?UP:
????????????????temp?=?arr[x?-?1][y];
????????????????arr[x?-?1][y]?=?0;
????????????????arr[x][y]?=?temp;
????????????????x?=?x?-?1;
????????????????break;
????????????/?空格和下方数字交换
????????????case?DOWN:
????????????????temp?

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg


640?wx_fmt=png

请教大神


小史回到学校,把面试的情况和计算机学院的吕老师说了一下。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg


640?wx_fmt=png

迷宫问题


640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

小史:每个点都可以按照右下左上的方向来进行尝试,如果是墙壁,就换一个方向,如果可以走,就往前走到下一点,然后再接着尝试。直到到达终点为止。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

吕老师随手又画了一个迷宫。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

吕老师:小史,这块并不是往左走,而是回退,退回到上一步。如果我们正在往前搜索,当然不能走回头路。但是当前面没有路的时候,我们就需要返回来,找到之前有可能出现岔路口的地方,再去下一个方向进行搜索。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg


640?wx_fmt=png

华容道问题


640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

小史:吕老师,我明白了,空格在华容道中移动,就好像我在迷宫里走动一样,每次到一个新的状态,就有几个方向可以搜索,如果是之前碰到过的状态,那就不搜索。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg


640?wx_fmt=png

递归实现回溯


640?wx_fmt=jpeg

小史:“回溯”的过程有点像栈的操作。往前走一步就像是入栈,到了死胡同,要往回退,就像是出栈。

640?wx_fmt=jpeg

吕老师:这个过程确实是栈的过程,但是直接用栈的话,对于你刚刚接触搜索算法,可能编码比较难。其实你可以用递归来实现这个搜索过程。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

小史:我在走迷宫的时候,每走一步,就把这一步是往哪走的记录下来,但是碰到了死胡同,往回退的时候,我又把之前记录的步骤最后一步去掉。这样一来,达到终点的时候,我记下来的步骤就是一条从起点到终点的路径了。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

小史:记录移动路径,其实就是在真正搜索之前,把方向记录下来,而搜索如果要返回了,则说明该次搜索已经结束,没有结果,应该把该记录去除。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg


640?wx_fmt=png

小史的努力


吃完烤串,喝完小酒,小史和吕老师休闲地走在回学校的路上。

640?wx_fmt=jpeg


640?wx_fmt=jpeg

吕老师笑而不语。

回到宿舍,小史就打开了电脑,手在键盘上飞快地敲了起来。

理解了算法之后,小史的代码写起来也是非常快,不一会儿就写好了:

import?java.util.HashSet;
import?java.util.LinkedList;
import?java.util.List;
import?java.util.Set;

/**
?*?@author?xiaoshi?on?2018/9/8.
?*/

public?class?HuaRongDao?{

????/?定义方向
????private?static?final?int?LEFT?=?1;
????private?static?final?int?RIGHT?=?2;
????private?static?final?int?UP?=?3;
????private?static?final?int?DOWN?=?4;

????/?3x3的九宫格
????private?int[][]?arr;

????/?记录空格的位置
????private?int?x;
????private?int?y;

????/?定义移动的数组
????private?List<Integer>?moveArr?=?new?LinkedList<Integer>();

????/?定义终点状态
????private?static?final?Integer?WIN_STATE?=?123456780;

????/?保存已经搜索过的状态
????private?Set<Integer>?statusSet?=?new?HashSet<Integer>();

????/?初始化,数字0代表空格,先遍历,找出空格的位置
????public?HuaRongDao(int[][]?arr)?{
????????this.arr?=?arr;
????????for(int?i=0;?i<arr.length;?i++)?{
????????????for(int?j=0;?j<arr.length;?j++)?{
????????????????if(arr[i][j]?==?0)?{
????????????????????x?=?i;
????????????????????y?=?j;
????????????????}
????????????}
????????}
????}

????/?判断是否可以朝某个方向进行移动
????private?boolean?canMove(int?direction)?{
????????switch?(direction)?{
????????????/?y?>?0才能左移
????????????case?LEFT:
????????????????return?y?>?0;
????????????/?y?<?2才能右移
????????????case?RIGHT:
????????????????return?y?<?2;
????????????/?x?>?0才能上移
????????????case?UP:
????????????????return?x?>?0;
????????????/?x?<?2才能下移
????????????case?DOWN:
????????????????return?x?<?2;
????????}
????????return?false;
????}

????/?朝某个方向进行移动,该函数不作判断,直接移动
????/?调用前请自行用canMove先行判断
????private?void?move(int?direction)?{
????????int?temp;
????????switch?(direction)?{
????????????/?空格和左侧数字交换
????????????case?LEFT:
????????????????temp?=?arr[x][y?-?1];
????????????????arr[x][y?-?1]?=?0;
????????????????arr[x][y]?=?temp;
????????????????y?=?y?-?1;
????????????????break;
????????????/?空格和右侧数字交换
????????????case?RIGHT:
????????????????temp?=?arr[x][y?+?1];
????????????????arr[x][y?+?1]?=?0;
????????????????arr[x][y]?=?temp;
????????????????y?=?y?+?1;
????????????????break;
????????????/?空格和上方数字交换
????????????case?UP:
????????????????temp?=?arr[x?-?1][y];
????????????????arr[x?-?1][y]?=?0;
????????????????arr[x][y]?=?temp;
????????????????x?=?x?-?1;
????????????????break;
????????????/?空格和下方数字交换
????????????case?DOWN:
????????????????temp?=?arr[x?+?1][y];
????????????????arr[x?+?1][y]?=?0;
????????????????arr[x][y]?=?temp;
????????????????x?=?x?+?1;
????????????????break;
????????}
????????/?该方向记录
????????moveArr.add(direction);
????}

????/?某个方向的回退,该函数不作判断,直接移动
????/?其操作和move方法正好相反
????private?void?moveBack(int?direction)?{
????????int?temp;
????????switch?(direction)?{
????????????/?空格和左侧数字交换
????????????case?LEFT:
????????????????temp?=?arr[x][y?+?1];
????????????????arr[x][y?+?1]?=?0;
????????????????arr[x][y]?=?temp;
????????????????y?=?y?+?1;
????????????????break;
????????????/?空格和右侧数字交换
????????????case?RIGHT:
????????????????temp?=?arr[x][y?-?1];
????????????????arr[x][y?-?1]?=?0;
????????????????arr[x][y]?=?temp;
????????????????y?=?y?-?1;
????????????????break;
????????????/?空格和上方数字交换
????????????case?UP:
????????????????temp?=?arr[x?+?1][y];
????????????????arr[x?+?1][y]?=?0;
????????????????arr[x][y]?=?temp;
????????????????x?=?x?+?1;
????????????????break;
????????????/?空格和下方数字交换
????????????case?DOWN:
????????????????temp?=?arr[x?-?1][y];
????????????????arr[x?-?1][y]?=?0;
????????????????arr[x][y]?=?temp;
????????????????x?=?x?-?1;
????????????????break;
????????}
????????/?记录的移动步骤出栈
????????moveArr.remove(moveArr.size()?-?1);
????}

????/?获取状态,这里把9个数字按顺序组成一个整数来代表状态
????/?方法不唯一,只要能区分九宫格状态就行
????private?Integer?getStatus()?{
????????int?status?=?0;
????????for(int?i=0;?i<arr.length;?i++)?{
????????????for(int?j=0;?j<arr.length;?j++)?{
????????????????status?=?status?*?10?+?arr[i][j];
????????????}
????????}
????????return?status;
????}

????/?搜索方法
????private?boolean?search(int?direction)?{
????????/?如果能够朝该方向行走
????????if(canMove(direction))?{
????????????/?往该方向移动
????????????move(direction);
????????????/?移动后的状态
????????????Integer?status?=?getStatus();
????????????/?如果已经是胜利状态,返回true
????????????if(WIN_STATE.equals(status))?{
????????????????return?true;
????????????}
????????????/?如果是之前走过的状态了,返回false
????????????if(statusSet.contains(status))?{
????????????????/?这一步走错了,回退
????????????????moveBack(direction);
????????????????return?false;
????????????}
????????????/?将当前状态存入set
????????????statusSet.add(status);
????????????/?继续朝四个方向进行搜索
????????????boolean?searchFourOk?=?search(RIGHT)?||?search(DOWN)?||?search(LEFT)?||?search(UP);
????????????if(searchFourOk)?{
????????????????return?true;
????????????}?else?{
????????????????/?这一步走错了,把它的记录去除
????????????????moveBack(direction);
????????????????return?false;
????????????}
????????}
????????return?false;
????}

????/?解题入口方法
????public?boolean?solve()?{
????????Integer?status?=?getStatus();
????????/?如果已经是胜利状态,返回true
????????if(WIN_STATE.equals(status))?{
????????????return?true;
????????}
????????/?初始状态先记录
????????statusSet.add(status);
????????/?朝4个方向进行搜索
????????return?search(RIGHT)?||?search(DOWN)?||?search(LEFT)?||?search(UP);
????}

????/?打印路径
????public?void?printRoute()?{
????????for(int?i=0;?i<moveArr.size();?i++)?{
????????????System.out.print(getDirString(moveArr.get(i)));
????????????System.out.print("?");
????????}
????}

????/?方向与其对应的字符串
????private?String?getDirString(int?dir)?{
????????switch?(dir)?{
????????????case?LEFT:
????????????????return?"左";
????????????case?RIGHT:
????????????????return?"右";
????????????case?UP:
????????????????return?"上";
????????????case?DOWN:
????????????????return?"下";
????????}
????????return?null;
????}

????/?打印当前华容道的状态
????public?void?print()?{
????????for(int?i=0;?i<arr.length;?i++)?{
????????????for(int?j=0;?j<arr.length;?j++)?{
????????????????System.out.print(arr[i][j]);
????????????????System.out.print("?");
????????????}
????????????System.out.println();
????????}
????}

}

几个测试用例下来,小史眉头一皱,发现事情并不简单。

640?wx_fmt=jpeg

小史经过缜密的分析,找到了原因。

640?wx_fmt=jpeg

我可以判断一下,如果某条路走的步数超过100步,就不再走了,赶紧回退。

小史在search函数中增加了moveArr.size()<100的判断,得到了最终结果。

640?wx_fmt=jpeg


640?wx_fmt=png

深搜和广搜


第二天,小史得意洋洋地拿着自己的代码去找吕老师秀起来。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

小史:现在的算法,没办法保证得到的解法就是最优解,并且它很容易进入复杂的死胡同出不来,有点像一个死钻牛角尖的人。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

吕老师:深度优先搜索,会在一个方向一直搜下去,直到这条路走不通,才会考虑第二个方向。

640?wx_fmt=jpeg

吕老师:广度优先搜索,是先搜索每一个可行方向的第一步,然后再接着搜索每一个可行方向的第二步。以此类推。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

小史:这个算法似乎没有“回溯”的必要了,没办法再用递归了吧?而且分头搜索这个方式应该怎么实现呢?

640?wx_fmt=jpeg

吕老师:你可以将要搜索的初始状态加到一个队列里,然后每次从队列中取出一个状态,往可以前进的方向前进一步,然后再将该状态放到队列。利用队列先进先出的特点,就可以实现广搜的效果。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

小史:每一步都记录上一步的状态和这次的方向。这样在达到最终胜利状态的时候,可以找到这个状态的上一步。而上一步又可以找到上上步,这不就是链表么?

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

理解了算法之后,小史的代码写起来也是非常快,不一会儿就写好了:

import?java.util.HashSet;
import?java.util.LinkedList;
import?java.util.List;
import?java.util.Set;

/**
?*?@author?xiaoshi?on?2018/9/8.
?*/

public?class?HuaRongDao?{

????/?定义方向
????private?static?final?int?LEFT?=?1;
????private?static?final?int?RIGHT?=?2;
????private?static?final?int?UP?=?3;
????private?static?final?int?DOWN?=?4;

????/?3x3的九宫格
????private?int[][]?arr;

????/?记录空格的位置
????private?int?x;
????private?int?y;

????/?定义移动的数组
????private?List<Integer>?moveArr?=?new?LinkedList<Integer>();

????/?定义终点状态
????private?static?final?Integer?WIN_STATE?=?123456780;

????/?保存已经搜索过的状态
????private?Set<Integer>?statusSet?=?new?HashSet<Integer>();

????/?初始化,数字0代表空格,先遍历,找出空格的位置
????public?HuaRongDao(int[][]?arr)?{
????????this.arr?=?arr;
????????for(int?i=0;?i<arr.length;?i++)?{
????????????for(int?j=0;?j<arr.length;?j++)?{
????????????????if(arr[i][j]?==?0)?{
????????????????????x?=?i;
????????????????????y?=?j;
????????????????}
????????????}
????????}
????}

????/?判断是否可以朝某个方向进行移动
????private?boolean?canMove(int?direction)?{
????????switch?(direction)?{
????????????/?y?>?0才能左移
????????????case?LEFT:
????????????????return?y?>?0;
????????????/?y?<?2才能右移
????????????case?RIGHT:
????????????????return?y?<?2;
????????????/?x?>?0才能上移
????????????case?UP:
????????????????return?x?>?0;
????????????/?x?<?2才能下移
????????????case?DOWN:
????????????????return?x?<?2;
????????}
????????return?false;
????}

????/?朝某个方向进行移动,该函数不作判断,直接移动
????/?调用前请自行用canMove先行判断
????private?void?move(int?direction)?{
????????int?temp;
????????switch?(direction)?{
????????????/?空格和左侧数字交换
????????????case?LEFT:
????????????????temp?=?arr[x][y?-?1];
????????????????arr[x][y?-?1]?=?0;
????????????????arr[x][y]?=?temp;
????????????????y?=?y?-?1;
????????????????break;
????????????/?空格和右侧数字交换
????????????case?RIGHT:
????????????????temp?=?arr[x][y?+?1];
????????????????arr[x][y?+?1]?=?0;
????????????????arr[x][y]?=?temp;
????????????????y?=?y?+?1;
????????????????break;
????????????/?空格和上方数字交换
????????????case?UP:
????????????????temp?=?arr[x?-?1][y];
????????????????arr[x?-?1][y]?=?0;
????????????????arr[x][y]?=?temp;
????????????????x?=?x?-?1;
????????????????break;
????????????/?空格和下方数字交换
????????????case?DOWN:
????????????????temp?=?arr[x?+?1][y];
????????????????arr[x?+?1][y]?=?0;
????????????????arr[x][y]?=?temp;
????????????????x?=?x?+?1;
????????????????break;
????????}
????????/?该方向记录
????????moveArr.add(direction);
????}

????/?某个方向的回退,该函数不作判断,直接移动
????/?其操作和move方法正好相反
????private?void?moveBack(int?direction)?{
????????int?temp;
????????switch?(direction)?{
????????????/?空格和左侧数字交换
????????????case?LEFT:
????????????????temp?=?arr[x][y?+?1];
????????????????arr[x][y?+?1]?=?0;
????????????????arr[x][y]?=?temp;
????????????????y?=?y?+?1;
????????????????break;
????????????/?空格和右侧数字交换
????????????case?RIGHT:
????????????????temp?=?arr[x][y?-?1];
????????????????arr[x][y?-?1]?=?0;
????????????????arr[x][y]?=?temp;
????????????????y?=?y?-?1;
????????????????break;
????????????/?空格和上方数字交换
????????????case?UP:
????????????????temp?=?arr[x?+?1][y];
????????????????arr[x?+?1][y]?=?0;
????????????????arr[x][y]?=?temp;
????????????????x?=?x?+?1;
????????????????break;
????????????/?空格和下方数字交换
????????????case?DOWN:
????????????????temp?=?arr[x?-?1][y];
????????????????arr[x?-?1][y]?=?0;
????????????????arr[x][y]?=?temp;
????????????????x?=?x?-?1;
????????????????break;
????????}
????????/?记录的移动步骤出栈
????????moveArr.remove(moveArr.size()?-?1);
????}

????/?获取状态,这里把9个数字按顺序组成一个整数来代表状态
????/?方法不唯一,只要能区分九宫格状态就行
????private?Integer?getStatus()?{
????????int?status?=?0;
????????for(int?i=0;?i<arr.length;?i++)?{
????????????for(int?j=0;?j<arr.length;?j++)?{
????????????????status?=?status?*?10?+?arr[i][j];
????????????}
????????}
????????return?status;
????}

????/?搜索方法
????private?boolean?search(int?direction)?{
????????/?如果能够朝该方向行走
????????if(canMove(direction))?{
????????????/?往该方向移动
????????????move(direction);
????????????/?移动后的状态
????????????Integer?status?=?getStatus();
????????????/?如果已经是胜利状态,返回true
????????????if(WIN_STATE.equals(status))?{
????????????????return?true;
????????????}
????????????/?如果是之前走过的状态了,返回false
????????????if(statusSet.contains(status))?{
????????????????/?这一步走错了,回退
????????????????moveBack(direction);
????????????????return?false;
????????????}
????????????/?将当前状态存入set
????????????statusSet.add(status);
????????????/?继续朝四个方向进行搜索
????????????boolean?searchFourOk?=?search(RIGHT)?||?search(DOWN)?||?search(LEFT)?||?search(UP);
????????????if(searchFourOk)?{
????????????????return?true;
????????????}?else?{
????????????????/?这一步走错了,把它的记录去除
????????????????moveBack(direction);
????????????????return?false;
????????????}
????????}
????????return?false;
????}

????/?解题入口方法
????public?boolean?solve()?{
????????Integer?status?=?getStatus();
????????/?如果已经是胜利状态,返回true
????????if(WIN_STATE.equals(status))?{
????????????return?true;
????????}
????????/?初始状态先记录
????????statusSet.add(status);
????????/?朝4个方向进行搜索
????????return?search(RIGHT)?||?search(DOWN)?||?search(LEFT)?||?search(UP);
????}

????/?打印路径
????public?void?printRoute()?{
????????for(int?i=0;?i<moveArr.size();?i++)?{
????????????System.out.print(getDirString(moveArr.get(i)));
????????????System.out.print("?");
????????}
????}

????/?方向与其对应的字符串
????private?String?getDirString(int?dir)?{
????????switch?(dir)?{
????????????case?LEFT:
????????????????return?"左";
????????????case?RIGHT:
????????????????return?"右";
????????????case?UP:
????????????????return?"上";
????????????case?DOWN:
????????????????return?"下";
????????}
????????return?null;
????}

????/?打印当前华容道的状态
????public?void?print()?{
????????for(int?i=0;?i<arr.length;?i++)?{
????????????for(int?j=0;?j<arr.length;?j++)?{
????????????????System.out.print(arr[i][j]);
????????????????System.out.print("?");
????????????}
????????????System.out.println();
????????}
????}

}

写完代码,小史赶紧运行看下最终结果:

1?2?3?
4?5?6?
8?7?0?
无法胜利
1?2?3?
4?0?6?
7?5?8?
可以胜利,路径为:下?右?
3?4?1?
5?6?0?
8?2?7?
可以胜利,路径为:左?左?上?右?下?左?下?右?右?上?左?左?下?右?上?上?右?下?左?左?上?右?下?右?下?

Process?finished?with?exit?code?0

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

一个问题一顿饭,吕老师不亏的。


640?wx_fmt=png

饭桌上的闲聊


640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

作者简介:channingbreeze,国内某互联网公司全栈开发。

声明:本文为作者投稿,版权归对方所有。作者独立观点,不代表?CSDN 立场。



征稿啦

CSDN 公众号秉持着「与千万技术人共成长」理念,不仅以「极客头条」、「畅言」栏目在第一时间以技术人的独特视角描述技术人关心的行业焦点事件,更有「技术头条」专栏,深度解读行业内的热门技术与场景应用,让所有的开发者紧跟技术潮流,保持警醒的技术嗅觉,对行业趋势、技术有更为全面的认知。

如果你有优质的文章,或是行业热点事件、技术趋势的真知灼见,或是深度的应用实践、场景方案等的新见解,欢迎联系 CSDN 投稿,联系方式:微信(guorui_1118,请备注投稿+姓名+公司职位),邮箱(guorui@申博现金网怎么样 www.661ib.com)。


————— 推荐阅读 —————

640?wx_fmt=png640?wx_fmt=png640?wx_fmt=png640?wx_fmt=gif

640?wx_fmt=gif

展开阅读全文
申博现金网怎么样

没有更多推荐了,申博现金网怎么样

申博开户直营网 www.sbc188.com 菲律宾申博娱乐管理网 太阳城申博官方直营网 申博电子娱乐 太阳城申博代理加盟
百家乐微信支付充值 申博官网下载直营网 www.sun838.com www.60705.com www.98msc.com 菲律宾太阳娱乐登入
www.sun838.com 申博138直营网 申博游戏登录直营网 菲律宾申博娱乐直营网 申博开户直营网 777老虎机支付宝充值