uva816
来源:互联网 发布:知秋小说猛兽 编辑:程序博客网 时间:2024/05/22 16:58
思路:主要是方向判断
package test;import java.util.ArrayList;import java.util.Arrays;import java.util.LinkedList;import java.util.Queue;import java.util.Scanner;public class Test{static Scanner sc = new Scanner(System.in);static String line;public static class Node{int r,c,dir;public Node(int r, int c, int dir) {super();this.r = r;this.c = c;this.dir = dir;}@Overridepublic boolean equals(Object obj) {Node n = (Node) obj;return (r==n.r&&c==n.c);}@Overridepublic String toString() {return "("+r+","+c+")";}}static char[] dirs = {'N','E','S','W'};static char[] turns = {'F','L','R'};static int[] dr = {-1,0,1,0};//与dc构成是个方向上的坐标变动static int[] dc = {-1,0,1,0};static int n = 9;//迷宫行列数static int[][][][] has_edge = new int[n][n][4][3];//记录某点,四个方向进入,某个方向对应的三种转向是否存在static int[][][] d = new int[n][n][4];//表示从初状态到r,c,dir的最短路径的长度static Node[][][] p = new Node[n][n][4];//记录父路径static int r1,c1,dir;//初始状态static int r2,c2;//目标状态/** * 把方向字符转换成数字 * @param c * @return */static int dir_id(char c){return Arrays.binarySearch(dirs, c); }/** * 把转向字符转换成数字 * @param c * @return */static int turn_id(char c){return Arrays.binarySearch(turns, c); }/** * 改变转向 * @param u * @param turn * @return */static Node walk(Node u, int turn){int dir = u.dir;if(turn == 1) dir = (dir+3)%4;//逆时针if(turn == 2) dir = (dir+1)%4;//顺时针return new Node(u.r,u.c,dir);}static void solve(){Queue<Node> queue = new LinkedList <Node>();//栈Node n = new Node(r1,c1,dir);//起始点queue.add(n);while(!queue.isEmpty()){Node u = queue.poll();if(u.r==r2&&u.c==r2){print_ans(u);return;}for(int i=0;i<3;i++){Node v = walk(u,i);//转身if(has_edge[v.r][v.c][v.dir][i]==1 && d[v.r][v.c][v.dir]<1 && inside(v.r,v.c)){//如果存在该方向,并且没有走过,并且d[v.r][v.c][v.dir] = d[u.r][u.c][u.dir] + 1;//路径加一p[v.r][v.c][v.dir] = u;//记录下父节点queue.add(v);}}}}static boolean inside(int x,int y){ if(x>=1&&x<=n&&y>=1&&y<=n) return true; return false;}private static void print_ans(Node u) {ArrayList<Node> nodes = new ArrayList<Node>();for(;;){nodes.add(u);if(d[u.r][u.c][u.dir]==0) break;u = p[u.r][u.c][u.dir];}System.out.println(nodes);}public static void main(String[] args) {solve();System.out.println(Arrays.deepToString(p));}}
0 0
- uva816
- UVa816
- uva816
- Uva816
- UVa816 bfs
- UVa816 Abbott's Revenge
- uva816 Abbott's Revenge
- UVa816 Abbott's Revenge
- Uva816 Abbott的复仇
- uva816 Abbott’s Revenge
- UVa816 Abbott的复仇
- UVA816 Abbott's Revenge
- UVA816 紫书bfs
- Abbott的复仇 Uva816
- UVa816 Abbott's Revenge
- [UVA816] Abbott's Revenge BFS
- uva816 -- Abbott's Revenge (BFS)
- uva816 Abbott's Revenge (BFS+回溯)
- 1026_程序运行时间(15)
- 1027_打印沙漏(20)
- Home Remedies To Improve Your Memory
- UVA 10684 || HOJ 1760 The jackpot
- HDU 2067 小兔的棋盘
- uva816
- 基本图论定义与术语(Basic Definition and Glossary in Graph The)
- 1029_旧键盘(20)
- java--正则表达式初步学习
- deepinlinux下安卓开发总结
- Python入门
- MAC下的java环境
- Leetcode:Container with most water菜鸟解法
- Jquery实现html4输入框提示