程序永远不会结束 [英] Program never ends

查看:107
本文介绍了程序永远不会结束的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不知道发生了什么,但在控制台中我有一个红色的停止方块,我可以点击停止我的程序运行(Eclipse IDE),我的程序正在运行,正方形保持红色。 。



编辑:



我的迷宫:

  WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW 
WSOOOOOOOOOOOOOOWOOOOOOOOOOOOOOOOOWOOOOOOOOOOOOOOOWOOOOOOW
WWOOOOOOOOOOOOOWWWWWWWWWWWWWOOOOOOOOOOWWWWWWWWWWWWWOOOOOOW
WWWWWWOOOOOOOOOOOOWWWWWWWOOOOOOOOOOOOWWWWWWWWWWWWWWWWOOOOW
WOOOOOOWWWWWWWWWWWWWWOOOOOOOOOOOWWWWWWWWOOOOOOOOOOOOOOOWWW
WOOOOWWWWWWWOOOOOOWWWWOOOOOOWWWWWWWWWWWOOOOWWWWWWWWWOWWWWW
WOOOWWWWWWWWWWWWOOWWWWWWWWWWWWOOOOOOOOOOOOWWWWWWWWWOOOOOWW
WOOWWWWWWWWWWWWWOOWWWWWWWWWWWWWWWWWOOOOOOOWWWWWWWWWWWWOOOW
WOWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWOOOOOOOWWWWWWWWWWWOOW
WOWWWWWWWWWWWWWOOOOOOOOOOOOOOOOOOOOOOOOOOOOWWWWWWWWWWWWOOW
WOOOOOOOOOOOOOOOOWWWWOOOOOOOOWWWWWWWOOOOOOWWWWWWWWWWWWWWFW
WWWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW

编辑:这是我的代码:

  import java.io.File; 
import java.io.FileNotFoundException;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Stack;
import java.awt.Point;

public class MazeExplorer {
static Point startPoint = new Point();
static Point finishPoint = new Point();
final static int mazeHeight = 12;
final static int mazeWidth = 58;
static char [] [] mazePoints = new char [mazeHeight] [mazeWidth];
堆栈< Point> pointsNotTraversed = new Stack< Point>();
Point pt = new Point();
static HashSet< Point> previousLocations = new HashSet< Point>();
static Stack< Point> nextPoints = new Stack< Point>();

public static void main(String [] args)throws FileNotFoundException {

System.out.println(请输入您的迷宫的文件名);
扫描仪控制台=新的扫描仪(System.in);
文件f = new File(console.nextLine());
扫描仪sc =新扫描仪(f);

if(!sc.hasNextLine()){
System.out.println(对不起,请输入一个包含迷宫的扩展名的文件名!
}
System.out.println(所以,你想知道你的迷宫是否可以解决.....?); (int row = 0; row< mazeHeight&& sc.hasNext();行++){
final String mazeRow = sc.next();

//从扫描仪获取下一行
mazePoints [row] = mazeRow.toCharArray(); //将行转换为char []。
}
//为(int i = 0; i {
for(int j = 0; j if(mazePoints [i] [j] =='F'){
finishPoint = new Point(i,j);
}
}
}
//确定(int i = 0; i< mazeHeight; i ++)的起始点
{
for j = 0; j if(mazePoints [i] [j] =='S'){
startPoint = new Point(i,j);
}
}
}
isTraversable(startPoint);
}
public static boolean isTraversable(Point current){
boolean isSolvable = false;
nextPoints.push(current);

do {


if(current.y< 11){
if((mazePoints [current.y + 1] x]!='')&&(mazePoints [current.y + 1] [current.x]!='W')){//在方向下方
nextPoints.push(new Point y + 1,current.x));
mazePoints [current.y + 1] [current.x] ='';
isTraversable(nextPoints.pop());

}
}
if(current.y> 0){


if(mazePoints [current.y - 1] [current.x]!=''&& mazePoints [current.y - 1] [current.x]!='W'){// up dir
nextPoints.push(new Point(current。 y - 1,current.x));
mazePoints [current.y - 1] [current.x] =''; //'X'标记你已经是
isTraversable(nextPoints.pop());

}
}
if(current.x< 57){
if(mazePoints [current.y] [current.x + 1]!=' '&& mazePoints [current.y] [current.x + 1]!='W'){//向右
nextPoints.push(new Point(current.y,current.x + 1 ));
mazePoints [current.y] [current.x + 1] ='';
isTraversable(nextPoints.pop());

}
}
if(current.x> 0){


if(mazePoints [current.y] [current .x - 1]!=''&& mazePoints [current.y] [current.x - 1]!='W'){//到左边
nextPoints.push(new Point .y,current.x - 1));
mazePoints [current.y] [current.x - 1] ='';
isTraversable(nextPoints.pop());

}
}
if(current.equals(finishPoint)){
isSolvable = true;
System.out.println(MAZE IS SOLVABLE,YAHOOOOOO !!!!);
}




} while(!current.equals('F')&!nextPoints.isEmpty());


return isSolvable;
}
}


解决方案

我之前建议,你只需要重新配置你的递归方法。我自由地这样做,但是如果你想学习如何编程,你会想要自己尝试和解决这些问题。或者尝试在开始编码之前了解您的解决方案的逻辑。



您的主要问题是您不知道您想要使用该方法的方向你刚刚跳入,导致各种错误与不同的东西不相容。

  import java.io 。文件; 
import java.io.FileNotFoundException;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Stack;
import java.awt.Point;

public class TestCode {
static Point startPoint = new Point();
static Point finishPoint = new Point();
final static int mazeHeight = 12;
final static int mazeWidth = 58;
static char [] [] mazePoints = new char [mazeHeight] [mazeWidth];
堆栈< Point> pointsNotTraversed = new Stack< Point>();
Point pt = new Point();
static HashSet< Point> previousLocations = new HashSet< Point>();
static Stack< Point> nextPoints = new Stack< Point>();

public static void main(String [] args)throws FileNotFoundException {

System.out.println(请输入您的迷宫的文件名);
扫描仪控制台=新的扫描仪(System.in);
文件f = new File(console.nextLine());
扫描仪sc =新扫描仪(f);

if(!sc.hasNextLine()){
System.out.println(对不起,请输入一个包含迷宫的扩展名的文件名!
}
System.out.println(所以,你想知道你的迷宫是否可以解决.....?); (int row = 0; row< mazeHeight&& sc.hasNext();行++){
final String mazeRow = sc.next();

//从扫描仪获取下一行
mazePoints [row] = mazeRow.toCharArray(); //将行转换为char []。
}
//为(int i = 0; i {
for(int j = 0; j if(mazePoints [i] [j] =='F'){
finishPoint = new Point(i,j);
}
}
}
//确定(int i = 0; i< mazeHeight; i ++)的起始点
{
for j = 0; j if(mazePoints [i] [j] =='S'){
startPoint = new Point(i,j);
}
}
}
System.out.println(isTraversable(startPoint));
}
public static boolean isTraversable(Point current){

mazePoints [current.x] [current.y] ='';

if(current.y< 56&&  current.y> 0&&& Current.x> 0&& current.x< 11){
if(mazePoints [current.x - 1] [current.y] =='O'){// Up dir
Point upPoint = new Point(current.x-1,current.y);
nextPoints.push(upPoint);
}

if(mazePoints [current.x + 1] [current.y] =='O'){// Down dir
Point downPoint = new Point(current .x + 1,current.y);
nextPoints.push(downPoint);
}

if(mazePoints [current.x] [current.y + 1] =='O'){//向右
Point rightPoint = new Point( current.x,current.y + 1);
nextPoints.push(rightPoint);
}

if(mazePoints [current.x] [current.y - 1] =='O'){//向左
点leftPoint = new Point( current.x,current.y-1);
nextPoints.push(leftPoint);
}

if(mazePoints [current.x - 1] [current.y] =='F'||
mazePoints [current.x + 1] [current。 y] =='F'||
mazePoints [current.x] [current.y - 1] =='F'||
mazePoints [current.x] [current.y + 1] =='F'){
System.out.println(MAZE IS SOLVABLE,YAHOOOOOO !!!!);
返回true;
}

}
if(nextPoints.isEmpty()){
return false;
}
else {
current = nextPoints.pop();
}

return(isTraversable(current));

}
}

迷宫输入: p>

  WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW 
WSOOOOOOOOOOOOOOWOOOOOOOOOOOOOOOOOWOOOOOOOOOOOOOOOWOOOOOOW
WWOOOOOOOOOOOOOWWWWWWWWWWWWWOOOOOOOOOOWWWWWWWWWWWWWOOOOOOW
WWWWWWOOOOOOOOOOOOWWWWWWWOOOOOOOOOOOOWWWWWWWWWWWWWWWWOOOOW
WOOOOOOWWWWWWWWWWWWWWOOOOOOOOOOOWWWWWWWWOOOOOOOOOOOOOOOWWW
WOOOOWWWWWWWOOOOOOWWWWOOOOOOWWWWWWWWWWWOOOOWWWWWWWWWOWWWWW
WOOOWWWWWWWWWWWWOOWWWWWWWWWWWWOOOOOOOOOOOOWWWWWWWWWOOOOOWW
WOOWWWWWWWWWWWWWOOWWWWWWWWWWWWWWWWWOOOOOOOWWWWWWWWWWWWOOOW
WOWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWOOOOOOOWWWWWWWWWWWOOW
WOWWWWWWWWWWWWWOOOOOOOOOOOOOOOOOOOOOOOOOOOOWWWWWWWWWWWWOOW
WOOOOOOOOOOOOOOOOWWWWOOOOOOOOWWWWWWWOOOOOOWWWWWWWWWWWWWOFW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW

产生以下输出:

 所以,你想知道你的迷宫是否是solv能够.....? 
MAZE是可以解决的,YAHOOOOOO !!!!
true

我以不同的方式导入了文件,但是您可以将其更改为任何以前使用的方法。


I'm not sure what's going on, but in the console I have a red 'stop' square that i can click to stop my program from running (Eclipse IDE) and my program is just running and the square stays red..?

EDIT:

my maze:

WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WSOOOOOOOOOOOOOOWOOOOOOOOOOOOOOOOOWOOOOOOOOOOOOOOOWOOOOOOW
WWOOOOOOOOOOOOOWWWWWWWWWWWWWOOOOOOOOOOWWWWWWWWWWWWWOOOOOOW
WWWWWWOOOOOOOOOOOOWWWWWWWOOOOOOOOOOOOWWWWWWWWWWWWWWWWOOOOW
WOOOOOOWWWWWWWWWWWWWWOOOOOOOOOOOWWWWWWWWOOOOOOOOOOOOOOOWWW
WOOOOWWWWWWWOOOOOOWWWWOOOOOOWWWWWWWWWWWOOOOWWWWWWWWWOWWWWW
WOOOWWWWWWWWWWWWOOWWWWWWWWWWWWOOOOOOOOOOOOWWWWWWWWWOOOOOWW
WOOWWWWWWWWWWWWWOOWWWWWWWWWWWWWWWWWOOOOOOOWWWWWWWWWWWWOOOW
WOWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWOOOOOOOWWWWWWWWWWWOOW
WOWWWWWWWWWWWWWOOOOOOOOOOOOOOOOOOOOOOOOOOOOWWWWWWWWWWWWOOW
WOOOOOOOOOOOOOOOOWWWWOOOOOOOOWWWWWWWOOOOOOWWWWWWWWWWWWWWFW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW

EDIT: here is my code:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Stack;
import java.awt.Point;

public class MazeExplorer {
    static Point startPoint = new Point();
    static Point finishPoint = new Point();
    final static int mazeHeight = 12;
    final static int mazeWidth = 58;
    static char[][] mazePoints = new char[mazeHeight][mazeWidth];
    Stack<Point> pointsNotTraversed = new Stack<Point>();
    Point pt = new Point();
    static HashSet<Point> previousLocations = new HashSet<Point>();
    static Stack<Point> nextPoints = new Stack<Point>();

    public static void main(String[] args) throws FileNotFoundException{

        System.out.println("Please enter the file name of your Maze");
        Scanner console = new Scanner(System.in);
        File f = new File(console.nextLine());
        Scanner sc = new Scanner(f);

        if(!sc.hasNextLine()){
            System.out.println("Sorry, please enter a file name with the extension, that contains a maze!");
        }
        System.out.println("So, you want to know if your maze is solvable.....?");

        for (int row = 0; row < mazeHeight && sc.hasNext(); row++) {
            final String mazeRow = sc.next(); //Get the next row from the scanner.
            mazePoints[row] = mazeRow.toCharArray(); //Convert the row into a char[].
        }
            //identify the finish point
        for(int i = 0; i < mazeHeight; i++){
            for(int j = 0; j<mazeWidth; j++){
                if(mazePoints[i][j] == 'F'){
                    finishPoint = new Point(i, j);
                }       
            }
        }
        // Identify the start point
       for(int i = 0; i< mazeHeight; i++){
           for(int j = 0; j < mazeWidth; j++){
               if(mazePoints[i][j] == 'S'){
                 startPoint = new Point(i , j);
               }
           }
       }
       isTraversable(startPoint);    
    }
        public static  boolean isTraversable(Point current){
            boolean isSolvable = false;
            nextPoints.push(current);

            do {


                if(current.y < 11) {
                    if((mazePoints[current.y + 1][current.x] != ' ') && (mazePoints[current.y + 1][current.x] != 'W') ){ // below direction
                    nextPoints.push(new Point(current.y + 1, current.x));
                    mazePoints[current.y + 1][current.x] = ' ';        
                    isTraversable(nextPoints.pop());    

                }
                }
                if(current.y > 0){


                if (mazePoints[current.y - 1][current.x] != ' ' && mazePoints[current.y - 1][current.x] != 'W' ){ //up dir
                   nextPoints.push(new Point(current.y - 1, current.x));
                    mazePoints[current.y - 1][current.x] = ' ';  //'X' marks where you've already been
                   isTraversable(nextPoints.pop());     

                }
                }
                if(current.x < 57){
                if(mazePoints[current.y][current.x + 1] != ' ' && mazePoints[current.y][current.x + 1] != 'W'){ // to the right
                    nextPoints.push(new Point(current.y, current.x + 1));
                    mazePoints[current.y][current.x + 1] = ' ';
                    isTraversable(nextPoints.pop());    

                }
                }
                if(current.x > 0){


                if(mazePoints[current.y][current.x - 1] != ' ' && mazePoints[current.y][current.x - 1] != 'W') { // to the left
                    nextPoints.push(new Point(current.y, current.x - 1));
                    mazePoints[current.y][current.x - 1] = ' ';     
                    isTraversable(nextPoints.pop());    

                }
                }
                if(current.equals(finishPoint)){
                    isSolvable = true;
                    System.out.println("MAZE IS SOLVABLE, YAHOOOOOO!!!!");
                }




            } while(!current.equals('F') && !nextPoints.isEmpty());    


            return isSolvable;          
        }
}

解决方案

As I suggested before, you just need to reconfigure your recursive method. I took the liberty of doing this but if you ever want to learn how to program you'll want to try and solve problems like these on your own. Or try to understand the logic of your solution before you start coding.

Your main problem is that you don't know what direction you want to go in with the method before you just jumped in and that was causing all sorts of errors with different things not being compatible with each other.

import java.io.File;
import java.io.FileNotFoundException;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Stack;
import java.awt.Point;

public class TestCode {
    static Point startPoint = new Point();
    static Point finishPoint = new Point();
    final static int mazeHeight = 12;
    final static int mazeWidth = 58;
    static char[][] mazePoints = new char[mazeHeight][mazeWidth];
    Stack<Point> pointsNotTraversed = new Stack<Point>();
    Point pt = new Point();
    static HashSet<Point> previousLocations = new HashSet<Point>();
    static Stack<Point> nextPoints = new Stack<Point>();

public static void main(String[] args) throws FileNotFoundException{

    System.out.println("Please enter the file name of your Maze");
    Scanner console = new Scanner(System.in);
    File f = new File(console.nextLine());
    Scanner sc = new Scanner(f);

    if(!sc.hasNextLine()){
        System.out.println("Sorry, please enter a file name with the extension, that contains a maze!");
    }
    System.out.println("So, you want to know if your maze is solvable.....?");

    for (int row = 0; row < mazeHeight && sc.hasNext(); row++) {
        final String mazeRow = sc.next(); //Get the next row from the scanner.
        mazePoints[row] = mazeRow.toCharArray(); //Convert the row into a char[].
    }
        //identify the finish point
    for(int i = 0; i < mazeHeight; i++){
        for(int j = 0; j<mazeWidth; j++){
            if(mazePoints[i][j] == 'F'){
                finishPoint = new Point(i, j);
            }       
        }
    }
    // Identify the start point
   for(int i = 0; i< mazeHeight; i++){
       for(int j = 0; j < mazeWidth; j++){
           if(mazePoints[i][j] == 'S'){
             startPoint = new Point(i , j);
           }
       }
   }
   System.out.println(isTraversable(startPoint));    
}
    public static  boolean isTraversable(Point current){

        mazePoints[current.x][current.y] = ' ';

        if(current.y < 56 && current.y > 0 && current.x > 0 && current.x < 11){
            if (mazePoints[current.x - 1][current.y] == 'O'){ // Up dir
                Point upPoint = new Point(current.x-1, current.y);
                nextPoints.push(upPoint);
            }

            if(mazePoints[current.x+1][current.y] == 'O'){ // Down dir
                Point downPoint = new Point(current.x+1, current.y);
                nextPoints.push(downPoint);
            }

            if(mazePoints[current.x][current.y + 1] == 'O'){ // to the right
                Point rightPoint = new Point(current.x, current.y+1);
                nextPoints.push(rightPoint);
            }

            if(mazePoints[current.x][current.y - 1] == 'O'){ // to the left
                Point leftPoint = new Point(current.x, current.y-1);
                nextPoints.push(leftPoint);
            }

            if(mazePoints[current.x - 1][current.y] == 'F' ||
               mazePoints[current.x + 1][current.y] == 'F' ||
               mazePoints[current.x][current.y - 1] == 'F' ||
               mazePoints[current.x][current.y + 1] == 'F'){
                System.out.println("MAZE IS SOLVABLE, YAHOOOOOO!!!!");
                return true;
            }

        }
        if(nextPoints.isEmpty()){
            return false;
        }
        else{
            current = nextPoints.pop();
        }

        return(isTraversable(current));

    }
}

With the maze input:

WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WSOOOOOOOOOOOOOOWOOOOOOOOOOOOOOOOOWOOOOOOOOOOOOOOOWOOOOOOW
WWOOOOOOOOOOOOOWWWWWWWWWWWWWOOOOOOOOOOWWWWWWWWWWWWWOOOOOOW
WWWWWWOOOOOOOOOOOOWWWWWWWOOOOOOOOOOOOWWWWWWWWWWWWWWWWOOOOW
WOOOOOOWWWWWWWWWWWWWWOOOOOOOOOOOWWWWWWWWOOOOOOOOOOOOOOOWWW
WOOOOWWWWWWWOOOOOOWWWWOOOOOOWWWWWWWWWWWOOOOWWWWWWWWWOWWWWW
WOOOWWWWWWWWWWWWOOWWWWWWWWWWWWOOOOOOOOOOOOWWWWWWWWWOOOOOWW
WOOWWWWWWWWWWWWWOOWWWWWWWWWWWWWWWWWOOOOOOOWWWWWWWWWWWWOOOW
WOWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWOOOOOOOWWWWWWWWWWWOOW
WOWWWWWWWWWWWWWOOOOOOOOOOOOOOOOOOOOOOOOOOOOWWWWWWWWWWWWOOW
WOOOOOOOOOOOOOOOOWWWWOOOOOOOOWWWWWWWOOOOOOWWWWWWWWWWWWWOFW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW

Yields the following output:

So, you want to know if your maze is solvable.....?
MAZE IS SOLVABLE, YAHOOOOOO!!!!
true

I imported the file a different way, but you can change that back to whatever method you use previously.

这篇关于程序永远不会结束的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆