水管工游戏dfs啊哈算法117页

import java.util.Arrays;
import java.util.Scanner;
import java.util.Stack;
class guanzi{
    int x;
    int y;
}//用来记录经过点的坐标
public class 水管工游戏 {
    static int[][] a=new int[15][15];
    static boolean[][] book=new boolean[15][15];
    static Stack<guanzi> s=new Stack<>();//记录路径
    static int n,m;
    static int flag=0;
    static void dfs(int x,int y,int front){
        if(x==n-1&&y==m){//这里的y值要注意,要超出图边界,水管要出水,出图
            flag=1;
            while(!s.isEmpty()){
                System.out.println("("+s.peek().x+" "+s.peek().y+")");//输出路径,反向,可以再搞个数组反向存储一下
                s.pop();
            }
            return;
        }        
        if(x<0||x>=n||y<0||y>=m) return;//超过图边界return
        
        if(book[x][y]==true) return;//标记过return
        
        book[x][y]=true;//标记
        guanzi g=new guanzi();
        g.x=x;
        g.y=y;
        s.push(g);//把经过的点放入路径栈
        
        //水管口 左1 上2 右3 下4
        if(a[x][y]>=5&&a[x][y]<=6){//直的水管两种放置方式横放竖放
            if(front==1)//水管口在左边
                dfs(x,y+1,1);//横放向右移动水管口在左边1
            if(front==2)//水管口在上边
                dfs(x+1,y,2);//向下移动水管口在上边
            if(front==3)//水管口在右边
                dfs(x,y-1,3);//水管口在右边
            if(front==4)//水管口在下边
                dfs(x-1,y,4);    //水管口在下边                        
        }
        
        if(a[x][y]>=1&&a[x][y]<=4){//弯的水管
            if(front==1){//类似 特别要注意一下下一次的水管口的位置
                dfs(x+1,y,2);
                dfs(x-1,y,4);
            }                
            if(front==2){
                dfs(x,y+1,1);
                dfs(x,y-1,3);
            }                
            if(front==3){
                dfs(x+1,y,2);
                dfs(x-1,y,4);
            }                
            if(front==4){
                dfs(x,y+1,1);
                dfs(x,y-1,3);
            }                                
        }
        book[x][y]=false;
        if(!s.empty()) s.pop();
        return;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc=new Scanner(System.in);
        for(int i=0;i<15;i++){
            Arrays.fill(a[i],0);
            Arrays.fill(book[i],false);
        }        
        n=sc.nextInt();
        m=sc.nextInt();
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                a[i][j]=sc.nextInt();
        
        dfs(0,0,1);
        if(flag==0)
            System.out.println("NO");
        else
            System.out.println("YES");
    }

}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值