AIZU 2320 Infnity Maze

来源:互联网 发布:人人商城分销源码9.9 编辑:程序博客网 时间:2024/05/29 16:55

AIZU   2320   Infnity Maze       题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2320

题目大意:一个机器人,一张地图。地图上有机器人的初始位置,并用NSEW表示了朝向,'#'表示墙,'.'表示空地。每遇到不能走的地方(墙、边界)就向右拐。给出机器人要走的步数,问最后停在什么地方,朝向什么方向。

题目分析:DFS,vis要注意,加开一维朝向。如果走进了死胡同,会拐两次原路返回。剩下的就是无脑dfs了。

package May6thA;import java.math.BigInteger;import java.util.Scanner;public class Main {static BigInteger one=BigInteger.ONE,two=new BigInteger("2"),zero=BigInteger.ZERO;static String map[];static BigInteger vis[][][];static int h=1,w=1;static boolean modswitch;private static Node dfs(Node n){//System.out.println(n.x+" "+n.y+" "+n.dir+" left=="+n.stepleft);int d=0;switch(n.dir){case'N':d=0;break;case'S':d=1;break;case'E':d=2;break;case'W':d=3;}if(n.stepleft.equals(zero))return n;if(!vis[n.x][n.y][d].equals(zero)&&modswitch){//System.out.println("mod=="+vis[n.x][n.y][d].subtract(n.stepleft));n.stepleft=n.stepleft.mod(vis[n.x][n.y][d].subtract(n.stepleft));modswitch=false;}else vis[n.x][n.y][d]=n.stepleft;if(n.stepleft.equals(zero))return n;while(!n.goable()){//System.out.println("turning");n.turn();}switch(n.dir){case'N':return dfs(new Node(n.x-1,n.y,n.dir,n.stepleft.subtract(one)));case'E':return dfs(new Node(n.x,n.y+1,n.dir,n.stepleft.subtract(one)));case'S':return dfs(new Node(n.x+1,n.y,n.dir,n.stepleft.subtract(one)));default:return dfs(new Node(n.x,n.y-1,n.dir,n.stepleft.subtract(one)));}}public static void main(String[] args) {Scanner in=new Scanner(System.in);BigInteger l=one;while(h!=0||w!=0||!l.equals(zero)){modswitch=true;h=in.nextInt();w=in.nextInt();l=new BigInteger(in.next());if(h==0&&w==0&&l.equals(zero))break;vis=new BigInteger[h][w][4];map=new String[h];Node start = null;//System.out.println(h+" "+w+" "+l);in.nextLine();for(int i=0;i<h;i++){map[i]=in.nextLine();//System.out.println(map[i]);for(int j=0;j<w;j++){char c=map[i].charAt(j);for(int k=0;k<4;k++){vis[i][j][k]=zero;}if(c!='.'&&c!='#'){start=new Node(i,j,c,l);map[i].replace(map[i].charAt(j),'.');//System.out.println(i+" "+j+" "+c+" "+l);}}}start=dfs(start);System.out.println((start.x+1)+" "+(start.y+1)+" "+start.dir);}}static class Node{int x,y;char dir;BigInteger stepleft;public boolean goable(){switch(this.dir){case'N':return x>0&&map[x-1].charAt(y)!='#';case'S':return x+1<h&&map[x+1].charAt(y)!='#';case'E':return y+1<w&&map[x].charAt(y+1)!='#';case'W':return y>0&&map[x].charAt(y-1)!='#';}return false;}private void turn(){switch(this.dir){case'N':this.dir='E';break;case'S':this.dir='W';break;case'E':this.dir='S';break;case'W':this.dir='N';}}public Node(int x,int y,char dir,BigInteger stepleft){super();this.x = x;this.y = y;this.dir = dir;this.stepleft = stepleft;}}}
PS:用java就是爽







0 0