AIZU 2320 Infnity Maze
2014-05-08 21:07
253 查看
AIZU 2320 Infnity Maze 题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2320
题目大意:一个机器人,一张地图。地图上有机器人的初始位置,并用NSEW表示了朝向,'#'表示墙,'.'表示空地。每遇到不能走的地方(墙、边界)就向右拐。给出机器人要走的步数,问最后停在什么地方,朝向什么方向。
题目分析:DFS,vis要注意,加开一维朝向。如果走进了死胡同,会拐两次原路返回。剩下的就是无脑dfs了。
题目大意:一个机器人,一张地图。地图上有机器人的初始位置,并用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就是爽
相关文章推荐
- Win2003利用dfs(分布式文件系统)在负载均衡下的文件同步配置方案
- win2003分布式文件系统(dfs)配置方法[图文详解]
- win2003分布式文件系统及其部署 图文教程
- DFS使用方法总结
- FastDFS注意事项
- 无忧技术带您预览DFS(分布式文件系统)管理控制台
- C 语言实现迷宫 DFS算法
- 一幅图弄清DFT与DTFT,DFS的关系
- HDFS---Namenode
- HDFS ---- Services startup
- ZOJ Problem Set - 1711 解题报告
- ZOJ Problem Set - 2412解题报告
- ZOJ Problem Set - 1457 解题报告
- POJ1979 Red and Black 题解
- Timus 1557 Network Attack DFS+各种各种...
- [LeetCode] Permutations
- [LeetCode] Permutations II
- [LeetCode] Combination Sum
- [LeetCode] Combination Sum II
- [LeetCode] Generate Parentheses