Advertisement
lameski

Robot

Jan 24th, 2017
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.45 KB | None | 0 0
  1. import java.util.ArrayList;
  2. import java.util.Hashtable;
  3. import java.util.LinkedList;
  4. import java.util.List;
  5. import java.util.NoSuchElementException;
  6. import java.util.Scanner;
  7. import java.util.Stack;
  8. import java.util.Iterator;
  9. class SLLNode<E> {
  10. protected E element;
  11. protected SLLNode<E> succ;
  12.  
  13. public SLLNode(E elem, SLLNode<E> succ) {
  14. this.element = elem;
  15. this.succ = succ;
  16. }
  17.  
  18. @Override
  19. public String toString() {
  20. return element.toString();
  21. }
  22. }
  23.  
  24.  
  25. interface Queue<E> {
  26.  
  27. // Elementi na redicata se objekti od proizvolen tip.
  28.  
  29. // Metodi za pristap:
  30.  
  31. public boolean isEmpty ();
  32. // Vrakja true ako i samo ako redicata e prazena.
  33.  
  34. public int size ();
  35. // Ja vrakja dolzinata na redicata.
  36.  
  37. public E peek ();
  38. // Go vrakja elementot na vrvot t.e. pocetokot od redicata.
  39.  
  40. // Metodi za transformacija:
  41.  
  42. public void clear ();
  43. // Ja prazni redicata.
  44.  
  45. public void enqueue (E x);
  46. // Go dodava x na kraj od redicata.
  47.  
  48. public E dequeue ();
  49. // Go otstranuva i vrakja pochetniot element na redicata.
  50.  
  51. }
  52.  
  53. class LinkedQueue<E> implements Queue<E> {
  54.  
  55. // Redicata e pretstavena na sledniot nacin:
  56. // length go sodrzi brojot na elementi.
  57. // Elementite se zachuvuvaat vo jazli dod SLL
  58. // front i rear se linkovi do prviot i posledniot jazel soodvetno.
  59. SLLNode<E> front, rear;
  60. int length;
  61.  
  62. // Konstruktor ...
  63.  
  64. public LinkedQueue () {
  65. clear();
  66. }
  67.  
  68. public boolean isEmpty () {
  69. // Vrakja true ako i samo ako redicata e prazena.
  70. return (length == 0);
  71. }
  72.  
  73. public int size () {
  74. // Ja vrakja dolzinata na redicata.
  75. return length;
  76. }
  77.  
  78. public E peek () {
  79. // Go vrakja elementot na vrvot t.e. pocetokot od redicata.
  80. if (front == null)
  81. throw new NoSuchElementException();
  82. return front.element;
  83. }
  84.  
  85. public void clear () {
  86. // Ja prazni redicata.
  87. front = rear = null;
  88. length = 0;
  89. }
  90.  
  91. public void enqueue (E x) {
  92. // Go dodava x na kraj od redicata.
  93. SLLNode<E> latest = new SLLNode<E>(x, null);
  94. if (rear != null) {
  95. rear.succ = latest;
  96. rear = latest;
  97. } else
  98. front = rear = latest;
  99. length++;
  100. }
  101.  
  102. public E dequeue () {
  103. // Go otstranuva i vrakja pochetniot element na redicata.
  104. if (front != null) {
  105. E frontmost = front.element;
  106. front = front.succ;
  107. if (front == null) rear = null;
  108. length--;
  109. return frontmost;
  110. } else
  111. throw new NoSuchElementException();
  112. }
  113.  
  114. }
  115.  
  116.  
  117. class Graph<E> {
  118.  
  119. int num_nodes; // broj na jazli
  120. E nodes[]; // informacija vo jazlite - moze i ne mora?
  121. int adjMat[][]; // matrica na sosednost
  122.  
  123. @SuppressWarnings("unchecked")
  124. public Graph(int num_nodes) {
  125. this.num_nodes = num_nodes;
  126. nodes = (E[]) new Object[num_nodes];
  127. adjMat = new int[num_nodes][num_nodes];
  128.  
  129. for(int i=0;i<this.num_nodes;i++)
  130. for(int j=0;j<this.num_nodes;j++)
  131. adjMat[i][j]=0;
  132. }
  133.  
  134.  
  135.  
  136. public Graph(int num_nodes, E[] nodes) {
  137. this.num_nodes = num_nodes;
  138. this.nodes = nodes;
  139. adjMat = new int[num_nodes][num_nodes];
  140.  
  141. for(int i=0;i<this.num_nodes;i++)
  142. for(int j=0;j<this.num_nodes;j++)
  143. adjMat[i][j]=0;
  144. }
  145.  
  146.  
  147.  
  148. int adjacent(int x,int y)
  149. { // proveruva dali ima vrska od jazelot so indeks x do jazelot so indeks y
  150. return (adjMat[x][y]!=0)?1:0;
  151. }
  152.  
  153. void addEdge(int x,int y)
  154. { // dodava vrska megu jazlite so indeksi x i y
  155. adjMat[x][y]=1;
  156. }
  157.  
  158. void deleteEdge(int x,int y)
  159. {
  160. // ja brise vrskata megu jazlite so indeksi x i y
  161. adjMat[x][y]=0;
  162. }
  163.  
  164. // Moze i ne mora?
  165. E get_node_value(int x)
  166. { // ja vraka informacijata vo jazelot so indeks x
  167. return nodes[x];
  168. }
  169.  
  170. // Moze i ne mora?
  171. void set_node_value(int x, E a)
  172. { // ja postavuva informacijata vo jazelot so indeks na a
  173. nodes[x]=a;
  174. }
  175.  
  176. public int getNum_nodes() {
  177. return num_nodes;
  178. }
  179.  
  180. public void setNum_nodes(int num_nodes) {
  181. this.num_nodes = num_nodes;
  182. }
  183.  
  184. void dfsSearch(int node) {
  185. boolean visited[] = new boolean[num_nodes];
  186. for (int i = 0; i < num_nodes; i++)
  187. visited[i] = false;
  188. dfsRecursive(node, visited);
  189. }
  190.  
  191. void dfsRecursive(int node, boolean visited[]) {
  192. visited[node] = true;
  193. System.out.println(node + ": " + nodes[node]);
  194.  
  195. for (int i = 0; i < this.num_nodes; i++) {
  196. if(adjacent(node, i)==1){
  197. if (!visited[i])
  198. dfsRecursive(i, visited);
  199. }
  200. }
  201. }
  202.  
  203. void dfsNonrecursive(int node) {
  204. boolean visited[] = new boolean[num_nodes];
  205. for (int i = 0; i < num_nodes; i++)
  206. visited[i] = false;
  207. visited[node] = true;
  208. System.out.println(node + ": " + nodes[node]);
  209. Stack<Integer> s = new Stack<Integer>();
  210. s.push(node);
  211.  
  212. int pom;
  213.  
  214. while (!s.isEmpty()) {
  215. pom = s.peek();
  216. int pom1 = pom;
  217. for (int i = 0; i < num_nodes; i++) {
  218. if(adjacent(pom,i)==1){
  219. pom1 = i;
  220. if(!visited[i])
  221. break;
  222. }
  223. }
  224. if(!visited[pom1]){
  225. visited[pom1] = true;
  226. System.out.println(pom1 + ": " + nodes[pom1]);
  227. s.push(pom1);
  228. }
  229. else
  230. s.pop();
  231. }
  232.  
  233. }
  234.  
  235. void bfs(int node, int end){
  236. boolean visited[] = new boolean[num_nodes];
  237. for (int i = 0; i < num_nodes; i++)
  238. visited[i] = false;
  239. visited[node] = true;
  240. //System.out.println(node+": " + nodes[node]);
  241. Queue<Integer> q = new LinkedQueue<Integer>();
  242. q.enqueue(node);
  243.  
  244. int pom;
  245.  
  246. while(!q.isEmpty()){
  247. pom = q.dequeue();
  248.  
  249. for (int i = 0; i < num_nodes; i++) {
  250. if(adjacent(pom, i)==1){
  251. if (!visited[i]){
  252. visited[i] = true;
  253. System.out.println(i+": " + nodes[i]);
  254. q.enqueue(i);
  255. }
  256.  
  257. }
  258. }if(pom == end) break;
  259.  
  260.  
  261. }
  262.  
  263. }
  264.  
  265.  
  266.  
  267. @Override
  268. public String toString() {
  269. String ret=" ";
  270. for(int i=0;i<num_nodes;i++)
  271. ret+=nodes[i]+" ";
  272. ret+="\n";
  273. for(int i=0;i<num_nodes;i++){
  274. ret+=nodes[i]+" ";
  275. for(int j=0;j<num_nodes;j++)
  276. ret+=adjMat[i][j]+" ";
  277. ret+="\n";
  278. }
  279. return ret;
  280. }
  281.  
  282.  
  283. }
  284.  
  285. public class Robot {
  286.  
  287.  
  288. Graph g;
  289. int start_node; //indeks temeto koe e vlez
  290. int end_node; //indeks na temeto koe e izlez
  291. int m;
  292. int n;
  293. int x1,y1,x2,y2;
  294.  
  295. Hashtable<String,Integer> h;
  296. Hashtable<Integer,String> dh;
  297. public Robot() {
  298. h = new Hashtable<String,Integer>();
  299. dh = new Hashtable<Integer, String>();
  300.  
  301. }
  302. /*
  303. void bfs(int node, int end){
  304. boolean visited[] = new boolean[num_nodes];
  305. for (int i = 0; i < num_nodes; i++)
  306. visited[i] = false;
  307. visited[node] = true;
  308. //System.out.println(node+": " + nodes[node]);
  309. Queue<Integer> q = new LinkedQueue<Integer>();
  310. q.enqueue(node);
  311.  
  312. int pom;
  313.  
  314. while(!q.isEmpty()){
  315. pom = q.dequeue();
  316.  
  317. for (int i = 0; i < num_nodes; i++) {
  318. if(adjacent(pom, i)==1){
  319. if (!visited[i]){
  320. visited[i] = true;
  321. System.out.println(i+": " + nodes[i]);
  322. q.enqueue(i);
  323. }
  324.  
  325. }
  326. }if(pom == end) break;
  327.  
  328.  
  329. }
  330.  
  331. }*/
  332. int bfs(Pair start, int endx,int endy)
  333. {
  334. boolean visited[] = new boolean[g.num_nodes];
  335. for (int i = 0; i < g.num_nodes; i++)
  336. visited[i] = false;
  337. boolean temp = false;
  338. for(int i=0; i<g.num_nodes; i++)
  339. {
  340. //System.out.println(dh.get(i) +" " + start.x + "," + start.y);
  341. if(dh.get(i).equals( start.x + "," + start.y))
  342. {
  343. temp =true;
  344. break;
  345. }
  346. }
  347. if(!temp)
  348. return -1;
  349. visited[h.get(start.x + "," + start.y)] = true;
  350. Queue<Pair> q = new LinkedQueue<>();
  351. q.enqueue(start);
  352. while(!q.isEmpty())
  353. {
  354. Pair pom = q.dequeue();
  355. if(pom.x==endx && pom.y == endy)
  356. {
  357. return pom.len;
  358. }
  359.  
  360. for(int i=0; i<g.num_nodes; i++)
  361. {
  362. if(g.adjacent(h.get(pom.x + "," + pom.y), i)==1)
  363. {
  364. if(!visited[i])
  365. {
  366. visited[i]=true;
  367. String [] s= dh.get(i).split(",");
  368. int x = Integer.parseInt(s[0]);
  369. int y = Integer.parseInt(s[1]);
  370. q.enqueue(new Pair(x,y,pom.len+1));
  371. }
  372. }
  373. }
  374.  
  375.  
  376. }
  377. return -1;
  378. }
  379. public void generateGraph(int rows, int columns, String[] in){
  380. int num_nodes = 0;
  381. int pom = 0;
  382. String key;
  383. ArrayList<String> arrKey = new ArrayList<>();
  384.  
  385.  
  386.  
  387. for(int i=0; i<rows; i++){
  388. for(int j=0; j<columns; j++){
  389. if(in[i].charAt(j)!='1'){
  390. key = i+","+j;
  391. arrKey.add(key);
  392. h.put(key, num_nodes);
  393. dh.put(num_nodes, key);
  394. if(i==x1 && j==y1)
  395. start_node = num_nodes;
  396. if(i==x2 && j==y2)
  397. end_node = num_nodes;
  398. num_nodes++;
  399. }
  400. }
  401. }
  402.  
  403. g = new Graph(num_nodes, arrKey.toArray());
  404.  
  405. int x;
  406. int y;
  407. //generiranje na matrica na sosednost
  408. //System.out.println(in[0].charAt(1));
  409. //System.out.println("Vlegov");
  410. for(int i=0; i<rows-1; i++){
  411. for(int j=0; j<columns-1; j++){
  412. if(in[i].charAt(j)!='1'
  413. && in[i+1].charAt(j+1)!='1'
  414. && in[i].charAt(j+1)!='1'
  415. && in[i+1].charAt(j)!='1'){
  416. //dali ima teme desno od nego
  417. if(i<rows-1 && j<columns-2 && in[i].charAt(j+2)!='1'
  418. && in[i+1].charAt(j+2)!='1')
  419. {
  420. x = h.get(i+ "," +j);
  421. //System.out.println(j);
  422. y = h.get(i+ "," +(j+1));
  423. g.addEdge(x, y);
  424. }
  425. //dali ima teme levo od nego
  426. if(j>=1 && in[i].charAt(j-1)!='1' && in[i+1].charAt(j-1)!='1' && i<rows-1){
  427. x = h.get(i+","+j);
  428. y = h.get(i+","+(j-1));
  429. g.addEdge(x, y);
  430. }
  431. //dali ima teme nad nego
  432. if(i>=1 && in[i-1].charAt(j)!='1' && in[i-1].charAt(j+1)!='1' && j<columns-1){
  433. x = h.get(i+","+j);
  434. y = h.get((i-1)+","+j);
  435. g.addEdge(x, y);
  436. }
  437. //dali ima teme pod nego
  438. if(i<rows-2 &&
  439. in[i+2].charAt(j)!='1'
  440. && in[i+2].charAt(j+1)!='1' && j<columns-1){
  441. x = h.get(i+","+j);
  442. y = h.get((i+1)+","+j);
  443. g.addEdge(x, y);
  444. }
  445. }
  446. }
  447. }
  448. }
  449. void findPath(){
  450. boolean visited[] = new boolean[g.getNum_nodes()];
  451. for (int i = 0; i < g.getNum_nodes(); i++)
  452. visited[i] = false;
  453. visited[start_node] = true;
  454. Stack<Integer> s = new Stack<Integer>();
  455. s.push(start_node);
  456.  
  457. int pom;
  458. while (!s.isEmpty() && s.peek()!=end_node) {
  459. pom = s.peek();
  460. int pom1 = pom;
  461. for (int i = 0; i < g.getNum_nodes(); i++) {
  462. if(g.adjacent(pom,i)==1){
  463. pom1 = i;
  464. if(!visited[i])
  465. break;
  466. }
  467. }
  468. if(!visited[pom1]){
  469. visited[pom1] = true;
  470. //System.out.println(tmp.getIndex() + ": " + tmp.getInfo());
  471. s.push(pom1);
  472. }
  473. else
  474. s.pop();
  475. }
  476. if(s.isEmpty())
  477. System.out.println("Nema reshenie");
  478. else{
  479. Stack<Integer> os = new Stack<Integer>();
  480. while(!s.isEmpty())
  481. os.push(s.pop());
  482. while(!os.isEmpty())
  483. System.out.println(os.pop());
  484. }
  485. // public int findPath(){
  486. // boolean visited[] = new boolean[g.getNum_nodes()];
  487. // for (int i = 0; i < g.getNum_nodes(); i++)
  488. // visited[i] = false;
  489. // visited[start_node] = true;
  490. // Stack<Integer> s = new Stack<Integer>();
  491. // s.push(start_node);
  492. //
  493. // int pom;
  494. // while (!s.isEmpty() && s.peek()!=end_node) {
  495. // pom = s.peek();
  496. // int pom1 = pom;
  497. // for (int i = 0; i < g.getNum_nodes(); i++) {
  498. // if(g.adjacent(pom,i)==1){
  499. // pom1 = i;
  500. // if(!visited[i])
  501. // break;
  502. // }
  503. // }
  504. // if(!visited[pom1]){
  505. // visited[pom1] = true;
  506. // //System.out.println(tmp.getIndex() + ": " + tmp.getInfo());
  507. // s.push(pom1);
  508. // }
  509. // else
  510. // s.pop();
  511. // }
  512. // if(s.isEmpty())
  513. // {System.out.println("Nema kraj");
  514. // return -1;
  515. // }
  516. // else{
  517. // Stack<Integer> os = new Stack<Integer>();
  518. // while(!s.isEmpty())
  519. // {
  520. // os.push(s.pop());
  521. // System.out.print(os.peek()+ " ");
  522. // }
  523. // return os.size();
  524. // }
  525. }
  526.  
  527. // String findPath(int v, int w) {
  528. // Queue<Integer> q = new LinkedQueue<Integer>();
  529. // boolean[] visited = new boolean[g.num_nodes];
  530. // String[] pathTo = new String[g.num_nodes];
  531. //
  532. // q.enqueue(v);
  533. // pathTo[v] = v+" ";
  534. // while(q.peek() != null) {
  535. // if(runBFS(q.dequeue(),w,visited,q,pathTo))
  536. // break;
  537. // }
  538. // return pathTo[w];
  539. // }
  540. //
  541. // private boolean runBFS(int v, int w, boolean[] visited, Queue<Integer> q, String[] pathTo) {
  542. // if(visited[v]) {
  543. // }
  544. // else if(v == w){
  545. // return true;
  546. // }
  547. // else {
  548. // visited[v] = true;
  549. // Iterator vi = g.(v);
  550. // while(vi.hasNext()) {
  551. // int nextVertex = vi.next();
  552. // pathTo[nextVertex] = pathTo[v] + nextVertex + " ";
  553. // q.enqueue(nextVertex);
  554. // }
  555. // }
  556. // return false;
  557. // }
  558. //
  559. public static void main(String[] args) {
  560. Scanner in = new Scanner(System.in);
  561. Robot r = new Robot();
  562. int m = in.nextInt();
  563. int n = in.nextInt();
  564. in.nextLine();
  565. //in.nextLine();
  566. String[] line = new String[m];
  567. for(int i=0; i<m; i++)
  568. {
  569. line[i] = in.nextLine();
  570. line[i] = line[i].replaceAll("\\s", "");
  571. //in.nextLine();
  572. }
  573. //System.out.println(line[6]);
  574. int x1,y1,x2,y2;
  575.  
  576. x1 = in.nextInt();
  577. y1 = in.nextInt();
  578. x2 = in.nextInt();
  579. y2 = in.nextInt();
  580. in.close();
  581.  
  582. Pair p = new Pair(x1-1,y1-1,0);
  583. r.generateGraph(m, n, line);
  584. System.out.println(r.bfs(p, x2-1, y2-1));
  585. //r.g.bfs(r.h.get((x1-1)+","+(y1-1)));
  586. }
  587. }
  588.  
  589. class Pair
  590. {
  591. int x,y, len;
  592.  
  593. Pair(int i,int j, int len)
  594. {
  595. this.x = i;
  596. this.y = j;
  597. this.len = len;
  598. }
  599.  
  600. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement