国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

UVA 816 Abbott's Revenge

2019-11-08 02:33:31
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_PRoblem&problem=757

BFS,有點(diǎn)復(fù)雜,看著別人的代碼調(diào)試了半天,爭(zhēng)取自己寫(xiě)出來(lái)。

import java.util.LinkedList;import java.util.Queue;import java.util.Scanner;import java.util.Vector;public class Main {	static Scanner scan = new Scanner(System.in);	static String dirs = "NESW";	static String turns = "FLR";	static boolean[][][][] has_edge = new boolean[10][10][4][3];	static Node[][][] p = new Node[10][10][4];	static int[][][] d = new int[10][10][4];	static int[] dr = {-1,0,1,0};	static int[] dc = {0,1,0,-1};	static int r1,c1,dir,r2,c2,r0,c0;	/**	 * @param args	 */	public static void main(String[] args) {		// TODO Auto-generated method stub		while(input()){			slove();		}			}		//輸入	public static boolean input(){		for(int i=1;i<=9;i++){			for(int j=1;j<=9;j++){				for(int k=0;k<4;k++){					for(int l=0;l<3;l++){						has_edge[i][j][k][l] = false;					}				}			}		}		String name = scan.next();		if("END".equals(name))			return false;		r0 = scan.nextInt();		c0 = scan.nextInt();		char c = scan.next().charAt(0);		r2 = scan.nextInt();		c2 = scan.nextInt();		dir = dir_id(c);		r1 = r0 + dr[dir];		c1 = c0 + dc[dir];				while(true){			int x = scan.nextInt();			if(x==0)				break;			int y = scan.nextInt();			while(true){				String str = scan.next();				if(str.charAt(0)=='*')					break;				int dd = dir_id(str.charAt(0));				for(int i=1;i<str.length();i++){					has_edge[x][y][dd][turn_id(str.charAt(i))] = true;				}			}		}				System.out.println(name);		return true;	}	//將方向轉(zhuǎn)化為數(shù)字	public static int dir_id(char c){		return dirs.indexOf(c);	}		//將轉(zhuǎn)向轉(zhuǎn)化為數(shù)字	public static int turn_id(char c){		return turns.indexOf(c);	}		//判斷坐標(biāo)是否合法	public static boolean inSide(int x,int y){		return x>0&&x<=9&&y>0&&y<=9;	}		//BFS	public static void slove(){		Queue<Node> q = new LinkedList<>();		for(int i=1;i<=9;i++){			for(int j=1;j<=9;j++){				for(int k=0;k<4;k++){					d[i][j][k] = -1;				}			}		}	//	System.out.println(r2+","+c2+","+dir);		Node u = new Node(r1,c1,dir);		d[u.r][u.c][u.dir] = 0;		q.add(u);		while(!q.isEmpty()){			u = q.poll();			if(u.r==r2&&u.c==c2){				print_ans(u);				return;			}			for(int i=0;i<3;i++){				Node v = walk(u,i);				if(has_edge[u.r][u.c][u.dir][i]&&inSide(v.r,v.c)&&d[v.r][v.c][v.dir]<0){					d[v.r][v.c][v.dir] = d[u.r][u.c][u.dir]+1;					p[v.r][v.c][v.dir] = u;					q.add(v);				}			}		}		System.out.println("  No Solution Possible");	}		//控制下一步的方向	private static Node walk(Node u, int turn) {		int dir = u.dir;		if(turn == 1){//逆時(shí)針			dir =(dir+3)%4;		}				if(turn == 2){//順時(shí)針			dir = (dir+1)%4;		}		return new Node(u.r+dr[dir],u.c+dc[dir],dir);	}	//輸出答案	private static void print_ans(Node u) {		Vector<Node> nodes = new Vector<>();		for(;;){			nodes.add(u);			if(d[u.r][u.c][u.dir]==0){				break;			}			u = p[u.r][u.c][u.dir];		}		nodes.add(new Node(r0,c0,dir));		int cnt = 0;		for(int i=nodes.size()-1;i>=0;i--){			if(cnt%10==0)				System.out.print(" ");			System.out.printf(" (%d,%d)",nodes.get(i).r,nodes.get(i).c);			if(++cnt%10==0)				System.out.println();		}		if(nodes.size()%10!=0){			System.out.println();		}	}		//每個(gè)節(jié)點(diǎn)的信息,包含坐標(biāo),和從哪個(gè)方向來(lái)的	static class Node{		int r=0,c=0,dir=0;		public Node(int r,int c,int dir){			this.r = r;			this.c = c;			this.dir = dir;		}	}}


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 侯马市| 华池县| 集安市| 滨州市| 南昌市| 靖州| 霞浦县| 九龙县| 武陟县| 利川市| 漳浦县| 丽江市| 宁河县| 瓦房店市| 庄河市| 湖州市| 肥城市| 拜城县| 博野县| 海丰县| 修武县| 保山市| 盐源县| 德令哈市| 格尔木市| 垫江县| 甘孜| 商洛市| 韶山市| 南漳县| 南澳县| 乐都县| 吉木萨尔县| 瓮安县| 正安县| 德昌县| 弥渡县| 北川| 厦门市| 巫山县| 清流县|