2012-02-16 7 views
7

में एक भूलभुलैया हल करने वाला एल्गोरिदम बनाना मुझे जावा में एक भूलभुलैया सॉल्वर बनाने का कार्य सौंपा गया है। यहाँ काम है:जावा

Write an application that finds a path through a maze. 
The maze should be read from a file. A sample maze is shown below. 

O O O O O X O 
X X O X O O X 
O X O O X X X 
X X X O O X O 
X X X X O O X 
O O O O O O O 
X X O X X X O 

चरित्र 'एक्स' का प्रतिनिधित्व करता है एक दीवार या एक अवरुद्ध स्थिति और चरित्र 'O' एक ओपन पोजीशन प्रतिनिधित्व करता है। आप मान सकते हैं कि भूलभुलैया का प्रवेश हमेशा निचले दाएं हाथ कोने में होता है, और बाहर निकलने के लिए हमेशा ऊपरी बाएं कोने में होता है। आपके प्रोग्राम को फ़ाइल में आउटपुट भेजना चाहिए। यदि पथ पाया जाता है तो आउटपुट फ़ाइल में पथ होना चाहिए। यदि कोई पथ नहीं मिला है तो फ़ाइल में कोई संदेश भेजा जाना चाहिए। कृपया ध्यान दें कि एक भूलभुलैया एक समाधान पथ से अधिक हो सकती है, लेकिन इस अभ्यास में आपको केवल एक समाधान का पता लगाने के लिए कहा जा रहा है, सभी समाधान नहीं।

आपके प्रोग्राम को उस पथ को रिकॉर्ड करने के लिए एक स्टैक का उपयोग करना चाहिए जो यह खोज रहा है और बैकट्रैक अवरुद्ध स्थिति तक पहुंचता है।

अपना कोड लिखने से पहले एक पूर्ण एल्गोरिदम लिखना सुनिश्चित करें। कोई अतिरिक्त कक्षाएं बनाने के लिए स्वतंत्र महसूस करें जो आपको असाइनमेंट पूर्ण करने में मदद करेंगे।

public class Points<E> 
{ 
private int xCoord; 
private int yCoord; 
private char val; 
private boolean N; 
private boolean S; 
private boolean E; 
private boolean W; 

public Points() 
{ 
    xCoord =0; 
    yCoord =0; 
    val =' '; 
    N = true; 
    S = true; 
    E = true; 
    W = true; 

} 

public Points (int X, int Y) 
{ 
     xCoord = X; 
     yCoord = Y; 

} 

public void setX(int x) 
{ 
    xCoord = x; 
} 
public void setY(int y) 
{ 
    yCoordinate = y; 
} 

public void setNorth(boolean n) 
{ 
    N = n; 
} 
public void setSouth(boolean s) 
{ 
    S= s; 
} 
public void setEast(boolean e) 
{ 
    E = e; 
} 

public void setWest(boolean w) 
{ 
    W = w; 
} 

public int getX() 
{ 
    return xCoord; 

} 

public int getY() 
{ 
    return yCoord; 
} 
public char getVal() 
{ 
    return val; 
} 

public boolean getNorth() 
{ 
    return N; 
} 
public boolean getSouth() 
{ 
    return S; 
} 

public boolean getEast() 
{ 
    return E; 
} 
public boolean getWest() 
{ 
    return W; 
} 

public String toString1() 
{ 
    String result = "(" + xCoord + ", " +yCoord + ")"; 
    return result; 
} 

}

मैं:

Here's my Algorithm: 
1)Initialize array list to hold maze 
2)Read text file holding maze in format 
    o x x x x o 
    o o x o x x 
    o o o o o x 
    x x x x o o 
3)Create variables to hold numbers of columns and rows 
3)While text file has next line 
    A. Read next line 
    B. Tokenize line 
    C. Create a temporary ArrayList 
    D. While there are tokens 
     i. Get token 
     ii. create a Point 
     iii. add point to temp ArrayList 
     iv. increment maximum number of columns 
    E. Add temp to maze arraylist, increment max rows 
    F. initialize a hold of points as max rows - 1 
    G. Create a start point with x values as maximum number of rows - 1, and y values as maximum number of columns - 1 
    H. Create stack of points and push starting location 
    I. While finished searching is not done 
     i. Look at top of stack and check for finish 
     ii. check neighbors 
     iii. is there an open neighbor? 
      - if yes, update flags and push 
      - if no, pop from stack 
    J. Print solution 
4. Done is true 

वैसे भी, क्या मैं स्थापित किया है एक अंक वर्ग दिखाया गया है की स्थापना की है कि/सभी प्रमुख दिशाओं जो बूलियन्स वापस आ जाएगी में यात्रा करने के लिए तरीके मिलता है मुझे मुख्य में वास्तविक हल करने में समस्याएं आ रही हैं। यहां मेरे पास है:

import java.io.*; 
import java.util.*; 
import java.lang.*; 
import java.text.*; 


public class MazeSolve1 
{ 
    public static void main(String[] args) 
    { 
//Create arrayList of Points 
ArrayList<ArrayList<Points>> MAZE = new ArrayList<ArrayList<Points>>(); 
Scanner in = new Scanner(System.in); 

//Read File in 
System.out.print("Enter the file name: "); 
String fileName = in.nextLine(); 
fileName = fileName.trim(); 
FileReader reader = new FileReader(fileName+".txt"); 
Scanner in2 = new Scanner(reader); 

//Write file out 
FileWriter writer = new FileWriter("Numbers.out"); 
PrintWriter out = new PrintWriter(writer); 
boolean done = false; 
int maxCol = 0; 
int maxRow = 0; 

while(!done) { 

    //creating array lists 
    while (in2.hasNextLine()) { 
     //Read next line 
     String nextLine = in2.nextLine(); 
     //Tokenize Line 
     StringTokenizer st = new StringTokenizer(nextLine, " "); 
     //Create temp ArrayList 
     ArrayList<ArrayList<Points>> temp = new ArrayList<ArrayList<Points>>(); 

     //While there are more tokens 
     while (st.hasNextToken()) { 
      String token = st.nextToken(); 
      Points pt = new Points(); 
      temp.add(pt); 
      maxCol++ 
     } 
     MAZE.add(temp); 
     maxRow++; 
    } 

    //create hold arraylist for max rows of maze -1 
    //create variables for start x and y coordinates 
    ArrayList<ArrayList<Points>> hold = new ArrayList<ArrayList<Points>>(); 
    hold = MAZE.get(maxRow - 1); 
    int startColumn = hold.get(maxCol - 1); 
    int startRow = hold.get(maxRow - 1); 
    Point start = new Point(); 
    start.setX(startColumn); 
    start.setY(startRow); 

    //initialize stack, and push the start position 
    MyStack<Points> st = new ArrayStack<Points>(); 
    st.push(start.toString1()); 
    //south and east of start are edges of array 
    start.setSouth(false); 
    start.setEast(false); 

    //while your position is not equal to point (0,0) [finish] 
    while (st.peek() != "(0, 0)") { 

     //getting the next coordinate to the North 
     int nextY = start.getY() - 1; 
     int nextX = start.getX(); 

     //if character to the North is an O it's open and the North flag is true 
     if (hold.get(nextY) = 'O' && start.getNorth() == true) { 
      //set flags and push coordinate 
      start.setNorth(false); 
      st.push(start.toString1()); 
     } 
     //else pop from stack 
     else { st.pop(); } 

     //look at coordinate to the East 
     nextX = start.getX() + 1; 
     //if character to the East is a O and the East flag is true 
     if (hold.get(nextX) = 'O' && start.getEast() == true) { 
      //set flags and push coordinate 
      start.setEast(false); 
      st.push(start.toString1()); 
     } 
     //else pop from stack 
     else { st.pop(); } 

     //look at coordinate to the South 
     nextY = start.getY() + 1; 
     //if character to the South is a O and the West flag is true 
     if (hold.get(nextY) = 'O' && start.getSouth() == true) { 
      //set flags and push coordinate 
      start.setSouth(false); 
      st.push(start.toString1()); 
     } 
     //else pop from stack 
     else { st.pop() } 

     //keep looping until the top of the stack reads (0, 0) 
    } 

done = true; 
} 

//Print the results 
System.out.println("---Path taken---"); 
for (int i = 0; i< st.size(); i++) { 
    System.out.println(st.pop); 
    i++ 
} 

किसी भी वाक्यविन्यास त्रुटियों के अलावा, क्या आप मुझे कुछ मदद दे सकते हैं? बहुत बहुत धन्यवाद।

+0

क्या विशिष्ट त्रुटि आप सामना कर रहे हैं पर पूर्ण समाधान देखते हैं? – templatetypedef

+0

क्या आप अपनी समस्याओं का वर्णन कर सकते हैं? किस तरह से आप विश्वास करते हैं कि यह सही नहीं है? –

+0

खैर मुझे यकीन नहीं है कि क्या मैं वास्तविक पड़ोसी को सही ढंग से जांच रहा हूं, जैसे भूलभुलैया – Copernikush

उत्तर

7

आपको शायद अपने प्रोग्राम को module करना चाहिए - जैसा कि मैं इसे समझ सकता हूं, आप फ़ाइल से भूलभुलैया पढ़ रहे हैं और एक ही समय में इसे हल करने का प्रयास कर रहे हैं।

एक बेहतर दृष्टिकोण 2 अलग-अलग भागों में विभाजित करने के लिए कार्यक्रम होगा:

  1. इनपुट फ़ाइल पढ़ सकते हैं और सभी डेटा के साथ एक मैट्रिक्स बनाने
  2. दिया मैट्रिक्स से उलझन का समाधान

ऐसा करने से आप प्रत्येक भाग को अलग-अलग बनाने और परीक्षण करने में मदद करेंगे, जो शायद बेहतर, अधिक विश्वसनीय कार्यक्रम में परिणाम देगा।

उलझन को सुलझाने के लिए एक सरल BFS है, जो कि आपके एल्गोरिथ्म मूल रूप से सुझाव दिया है, जो एक DFS

+0

मुझे लगता है कि मूल एल्गोरिदम एक डीएफएस है, क्योंकि वह एक ढेर का उपयोग कर रहा है। उस ने कहा, मुझे बीएफएस समाधान पसंद है। – templatetypedef

+0

@templatetypedef: आप सही हैं, मैंने उस गलती को संपादित और ठीक किया है। धन्यवाद। – amit

+0

मुझे नहीं पता कि इसका क्या मतलब है ... हमने अभी तक यह सामान नहीं सीखा है। – Copernikush

1

अमित ने कहा है के रूप में, आप पहली बार पूरे भूलभुलैया पढ़ सकते हैं और एक के रूप में संग्रहीत करना चाहिए के समान है के द्वारा किया जा सकता है 2 आयामी सरणी। यह आपको लाइन-दर-रेखा को हल किए बिना पूरी भूलभुलैया को देखने देता है।

चूंकि आपको पहले सरणी के आकार को खोजने की आवश्यकता होगी, आपको टेक्स्ट फ़ाइल को स्ट्रिंग्स की सूची में पढ़ना चाहिए।

List<String> strs = new ArrayList<String>(); 

//Pseudocode, choose however you want to read the file 
while(file_has_next_line) { 
    strs.add(get_next_line); 
} 

सूची के आकार आप पंक्तियों की संख्या देता है, और यह हमेशा यह सोचते हैं एक ग्रिड, आप विभाजन का उपयोग कर सकते()। लंबाई, (रिक्त स्थानों +1 गिनती) या में से किसी एक पर प्रतीकों गिनती स्तंभों की संख्या प्राप्त करने के लिए स्ट्रिंग्स।

नक्शा डेटा स्टोर करने का सबसे आसान तरीका बूलियन के 2 डी सरणी के साथ है। जहां एक दीवार और झूठी खाली जगह खाली है।

boolean[][] wallMap = new boolean[rows][cols]; 

for(int i = 0; i < wallMap.length; i++) { 

    //Separate each symbol in corresponding line 
    String[] rowSymbols = strs.get(i).split(" "); 

    for(int j = 0; j < wallMap[i].length; j++) { 

     //Ternary operator can be used here, I'm just keeping it simple 
     if(rowSymbols[j].equals("X")) { 
      wallMap[i][j] = true; 
     } else { 
      wallMap[i][j] = false; 
     } 

    } 

} 

अब आप एक सरणी में संग्रहीत नक्शा डेटा है कि यह नक्शा पार करने और अपने विकल्प बनाने के लिए बहुत आसान है, तो आप उपयोग कर सकते हैं एक पहले से तैयार एल्गोरिथ्म (अमित के जवाब देखें) या अपना खुद का बनाएँ। चूंकि यह होमवर्क है, आपको अपना खुद का प्रयास करना चाहिए और सोचना चाहिए।

मज़े करें।

0

आपको अपने कार्यक्रम को दो चरणों में अलग करने की आवश्यकता है। पहला प्रारंभिकरण है, जहां आप भूलभुलैया विवरण और खिलाड़ी की प्रारंभिक स्थिति पढ़ते हैं। इसके बाद बोर्ड का प्रतिनिधित्व करने के लिए आपके पास डेटा संरचना है। दूसरा एक वास्तविक गेम है, जहां 3 एब्स्ट्रैक्शंस होना चाहिए:

  • खिलाड़ी राज्य। आपके मामले में यह बोर्ड पर इसकी वास्तविक स्थिति बहुत सरल है।
  • भूलभुलैया स्वयं, जो पर्यावरण है। यदि आपके पास देखी गई स्थिति को चिह्नित करने के लिए, लक्ष्य कहां है, अगली पहुंच योग्य कोशिकाओं, आदि ...
  • तर्क, जो खोज एल्गोरिदम है, यह आपको बताए गए कार्यों को देख सकता है।

इनमें से कोई भी दूसरों के बिना किसी बदलाव के बदल सकता है। उदाहरण के लिए, आपको अपने खोज एल्गोरिदम को सुधारने के लिए कहा जा सकता है, या ऐसी समस्या जहां आपके पास एक से अधिक लक्ष्य हैं। वर्तमान समस्या से थोड़ा संशोधित करने के लिए स्विच करने की आसानी एक प्रोग्राम डिजाइन की असली मीट्रिक है।

12

enter image description here

मैं यहाँ Maze Solving Algorithm in C++ एक ऐसी ही जवाब प्रस्तुत की।

इसे सुलझाने में एक मौका के लिए, आपको चाहिए:

  • एक Solve() दिनचर्या बनाएँ और रिकर्सिवली ही फोन:
    • 1st, 2nd, 3rd, ... सत्य हैं Solve है अगर एक समाधान खोजने में सफल
    • यदि प्रथम, 2, 3, ...शामिल एक झूठी, यह
  • पीछे और पता लगाने के लिए एक और तरीका है आप स्थानों पर आप के रूप में आप चाल इसे पर नजर रखने की जरूरत है बनाने के अनंत छोरों
    • से बचने के लिए किया गया है की एक बफर का निर्माण करने की आवश्यकता है
    • जब हम एक मृत अंत मारा, हम अगर यह गलत है हम एक अनुमान में जल रहा है और यह निकाल कर ऊपर लागू कर सकते हैं बुरा चाल
    • मिटाना हो

यहां समाधान के लिए कुछ छद्म कोड है।

boolean solve(int X, int Y) 
{ 
    if (mazeSolved(X, Y)) 
    { 
     return true; 
    } 

    // Test for (X + 1, Y) 
    if (canMove(X + 1, Y)) 
    { 
     placeDude(X + 1, Y); 
     if (solve(X + 1, Y)) return true; 
     eraseDude(X + 1, Y); 
    } 

    // Repeat Test for (X - 1, Y), (X, Y - 1) and (X, Y + 1) 
    // ... 

    // Otherwise force a back track. 
    return false; 
} 
0

मैंने कुछ जावा ओओपी अवधारणाओं का उपयोग करते हुए डीएफएस एल्गोरिदम का उपयोग करके इसे कार्यान्वित करने का प्रयास किया।

मेरी github repository

private boolean solveDfs() { 
    Block block = stack.peekFirst(); 
    if (block == null) { 
     // stack empty and not reached the finish yet; no solution 
     return false; 
    } else if (block.equals(maze.getEnd())) { 
     // reached finish, exit the program 
     return true; 
    } else { 
     Block next = maze.getNextAisle(block); 
     // System.out.println("next:" + next); 
     if (next == null) { 
      // Dead end, chose alternate path 
      Block discard = stack.pop(); 
      discard.setInPath(false); 
      // System.out.println("Popped:" + discard); 
     } else { 
      // Traverse next block 
      next.setVisited(true); 
      next.setInPath(true); 
      stack.push(next); 
     } 
    } 
    return solveDfs(); 

}