zoukankan      html  css  js  c++  java
  • 水管工游戏

    原创

    游戏的大致规则是这样的:一块矩形土地被分为N*M的单位正方形,现在这块土地上已经埋设有一些水管,水管将从坐标

    为(0,0)的矩形土地的左上角左部边缘,延伸到坐标为(N-1,M-1)的矩形土地的右下角右部边缘。水管只有2种,如下

    所示。

    每种管道将占据一个单位正方形土地。现在可以旋转这些管道,使其构成一个管道系统,即创造一条从(0,0)到(N-1,M-1)

    的连通管道。标有树木的方格表示这里没有管道。如下图表示一个5*4的土地中(2,4)处有一个树木。

    我们可以旋转其中的一些管道,使之构成一个连通的管道系统,如下图:

    输入的第一行为两个整数N和M,接下来的N行,每行有M个整数,表示地图中的每一小格。其中0表示树木,

    1~6分别表示管道的六种不同的摆放方式,如下图:

    解题思路:

      解题用深搜(一笔画问题),但是此题的深搜方向由于进水口的方向限制,最多只能有两种情况,所以

    不必要设置方向数组了;由于水管只有两种状态,弯管和直管,所以只要枚举这两种状态,在这两种状态的

    基础上再枚举水管的四个方向,就能分别确定接下来水通往哪个格子,再继续枚举下去即可。

    import java.util.*;
    
    public class 水管工游戏 {
        
        static int count=0;
        static int flag=0;
        static int n;
        static int m;
        static int maze[][];
        static int book[][];
        static ArrayList listx=new ArrayList();
        static ArrayList listy=new ArrayList();
        
        static void dfs(int x,int y,char way) {    //way代表入水口
            if(x==n-1 && y==m) {    //成功判断
                flag=1;
                return;
            }
            if(x<0 || x>n-1 || y<0 || y>m-1) {    //越界判断
                return;
            }
            if(maze[x][y]==0 || book[x][y]==1) {    //树木与访问判断
                return;
            }
            book[x][y]=1;
            listx.add(x);
            listy.add(y);
            count++;
            if(maze[x][y]==5 || maze[x][y]==6) {    //直管
                if(way=='l') {    //
                    dfs(x,y+1,'l');
                }
                if(way=='r') {    //
                    dfs(x,y-1,'r');
                }
                if(way=='u') {    //
                    dfs(x+1,y,'u');
                }
                if(way=='d') {    //
                    dfs(x-1,y,'d');
                }
            }
            if(maze[x][y]>=1 && maze[x][y]<=4){    //弯管
                if(way=='l') {    //
                    dfs(x-1,y,'d');
                    dfs(x+1,y,'u');
                }
                if(way=='r') {    //
                    dfs(x-1,y,'d');
                    dfs(x+1,y,'u');
                }
                if(way=='u') {    //
                    dfs(x,y-1,'r');
                    dfs(x,y+1,'l');
                }
                if(way=='d') {    //
                    dfs(x,y-1,'r');
                    dfs(x,y+1,'l');
                }
            }
            if(flag==1) {
                return;
            }
            book[x][y]=0;    //回溯
            listx.remove(count-1);
            listy.remove(count-1);
            count--;
            return;
        }
    
        public static void main(String[] args) {
            Scanner reader=new Scanner(System.in);
            n=reader.nextInt();
            m=reader.nextInt();
            maze=new int[n][m];
            book=new int[n][m];
            for(int i=0;i<n;i++) {
                for(int j=0;j<m;j++) {
                    maze[i][j]=reader.nextInt();
                    book[i][j]=0;
                }
            }
            dfs(0,0,'l');
            if(flag==1) {
                System.out.println("YES");
            }
            else {
                System.out.println("NO");
            }
            System.out.print("路径为:");
            for(int i=0;i<count;i++) {
                System.out.print("("+listx.get(i)+","+listy.get(i)+")"+" ");
            }
        }
    }

    测试用例:

    输入:

    5 4
    5 3 5 3
    1 5 3 0
    2 3 5 1
    6 1 1 5
    1 5 5 4

    输出:
    YES
    路径为:(0,0) (0,1) (1,1) (2,1) (2,2) (2,3) (3,3) (4,3)

    11:05:05

    2018-07-22

  • 相关阅读:
    编写可测试的程序
    系统程序员成长计划序
    编写可移植C/C++程序的要点
    Android IPC机制详解
    WordPress Attack Scanner插件多个信息泄露漏洞
    WordPress Simple History Plugin RSS Feed 信息泄露漏洞
    WordPress Poll插件多个SQL注入漏洞
    WordPress yolink Search插件‘s’参数跨站脚本漏洞
    WordPress Poll插件跨站请求伪造漏洞
    Python 'stringobject.c'多个远程缓冲区溢出漏洞
  • 原文地址:https://www.cnblogs.com/chiweiming/p/9347933.html
Copyright © 2011-2022 走看看