hdoj1728 java 深搜

来源:互联网 发布:万人赚软件下载 编辑:程序博客网 时间:2024/06/04 18:00

题目意思很明确就是给你起点和终点,还有一个最大拐弯数,判断能否在最大拐弯数之内从起点走到终点,

本题在思考的时候比正常的深搜的题目增加了一个思考点,就是拐弯数,怎么能把拐弯数加进程序,怎么能判断本次走的方向和之前的不一样,然后把本次拐弯数增加一,这是这个题的精髓之处。本题有一个本方法,就是创建四个拐弯数,然后一一列出每个深搜,虽然只有四个但是这样写也会显得程序非常臃肿。

我在程序里是这么考虑的,我既然创建了一个四个长度的数组,来控制他的前进方向,那么也就是说我的方向就已经定义好了,那么下一次的方向和本次要走的方向不同就可以用本次的方向数和下次的方向数比较就可以了。

本题还有一个与之前不同的地方,若果拿着按刚才的思路敲出的程序来提交你会悲剧的发现超时了,所以需要剪枝了,于是我们想在什么地方可以剪枝。这就是接下来需要思考的地方了,这次我们要异于常规,以前我们都是定义一个vis数组,用来标记是否访问过此节点,但这次我们可以把他的功能稍作调整,让他初始化时很大,意思就是初始状态的时候它的拐弯数是无穷大,没次访问之后就把当前的拐弯数与之前的比较,如果当前的小就更新此拐弯数,这样如果发现这次的拐弯数比以前的大那么我们直接放弃他就好了

import java.util.Scanner;


public class dfs_main {


static String maps;
//创建地图
static char[][] map = new char[101][101];
//创建地图访问标志
static int[][] vis = new int[101][101];
static int k, x1, y1, x2, y2;
static int n,m;
//标志是否符合条件
static int falg = 0;
static int[] a = {0,1,-1,0};
static int[] b = {1,0,0,-1};
public static void dfs(int w,int x,int y,int dir){
//把初始定义成无穷大,如果本次访问到此节点的拐弯数比上次的大,那么肯定不符合条件
if(w > vis[y][x])
return ;
else {
//如果小的话就更新它的拐弯数
vis[y][x] = w;
}
if(w > k || falg == 1){
return;
}

if(x == x2 && y == y2 && w <= k){
falg = 1;
return ;
}
int l,f,ww = 0;
for(int i=0;i<4;i++){
l = x + a[i];
f = y + b[i];

//如果方向不一致
if( dir != -1 && dir != i ){
ww = w+1;
}
else{
ww = w;
}
if(l>=0 && l<n && f>=0 && f<m && map[f][l]=='.'){

dfs(ww,l,f,i);
}

}
public static void main(String [] args){
Scanner cin = new Scanner (System.in);

int t = cin.nextInt();
while(t!= 0){
t--;
m = cin.nextInt();
n = cin.nextInt();
for(int i=0;i<=m;i++){//数组初始化-*

for(int j=0;j<=n;j++){

vis[i][j]=Integer.MAX_VALUE;
}

for(int i=0;i<m;i++){
maps = cin.next();
map[i] = maps.toCharArray();
}

k = cin.nextInt();
x1 = cin.nextInt()-1;
y1 = cin.nextInt()-1;
x2 = cin.nextInt()-1;
y2 = cin.nextInt()-1;
// System.out.println(k + " " + x1 + " " + x2 + " " + y1 + " " +y2 + " ");
falg = 0;
dfs(0,x1,y1,-1);
if(falg == 1){
System.out.println("yes");
}else{
System.out.println("no");
}
}
}
}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 百度网盘登录要验证码怎么办 百度网盘备份记录怎么办能删掉 手机酷狗听歌耳机声音太小了怎么办 苹果6s微信通话声音变粗怎么办 千千静听多个列表合成一个了怎么办 别人用手机号注册了邮箱怎么办 微信身份信息验证未通过怎么办 快递地址填错了已经发到了怎么办 孩子威胁同学给她买东西吃怎么办 在超市买小孩米粉过期了怎么办 出口货物被海关扣了说仿牌怎么办 有一批仿牌被宁波海关查了怎么办 付了定金不想要车了怎么办 泥墙刮石灰上涂料现在刮腻子怎么办 月经最后一天同房了怎么办吃什么药 奶水太多了宝宝总是呛到了怎么办 婴儿刚吃完奶大量喷奶怎么办 我干活细致领导说我慢怎么办 怀孕初期吃了加明矾的粉皮怎么办 绿豆面黄豆面白面蒸馒头怎么办 画油画时把颜料染在衣服上怎么办 买的布衣柜少了一个管子怎么办 小2球刚好进2球怎么办 大2球刚好进2球怎么办 大球2进了2球怎么办 身上剩的几百块钱有掉了怎么办 刚买一天的手机电板有问题怎么办 宝宝长湿疹穿少了就感冒怎么办 照片跟视频被孩子删了怎么办 老公总是说一些不开心的话题怎么办 孩子沉迷手机篮球课不爱去怎么办 坐久了屁鼓会长疮怎么办 套胶的胶皮与海绵分离怎么办 换肾15天了沒尿怎么办? 妻子的绒癌怎么办?——急人! 孕妇结石掉在输尿管有血尿怎么办 吃葯时药片沾在食管臂上怎么办 八十多了膀胱癌手术复发了怎么办 尿蛋白和尿隐血2个加怎么办 小肝癌手术后两个月又复发了怎么办 膀胱癌血尿堵塞尿道和尿管怎么办