AIZU 2320 Infnity Maze

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就是爽







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值