骑士旅行问题

原创 2011年10月13日 22:41:09
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Knight extends JApplet implements ActionListener
{
	final int MAX=9;
	int chessBoard[][];
	int chessBoardPossibility[][];
	
	final int horizontal[]={ 2, 1, -1, -2, -2, -1, 1, 2 },vertical[]={ -1, -2, -2, -1, 1, 2, 2, 1 };
	int currentRow=1,currentColumn=1;
	int stepsCounter=1;
	int steps=(int)Math.pow(2, MAX);
	
	JTextArea outputArea;
	
	JButton startButton;
	
	public void init()
	{
		chessBoard=new int[MAX][MAX];
		chessBoardPossibility=new int[MAX][MAX];
		for(int row=0; row<chessBoard.length; row++)
		{
			for(int column=0; column<chessBoard[row].length; column++)
			{
				chessBoard[row][column]=0;
				chessBoardPossibility[row][column]=possibilities(row, column);
			}
		}
		chessBoard[currentRow][currentColumn]=1;
		
		Container container=getContentPane();
		container.setLayout(new FlowLayout());
		
		outputArea=new JTextArea(25, 30);
		outputArea.setEditable(false);
		outputArea.setFont(new Font("Monospaced", Font.PLAIN, 12));
		container.add(outputArea);
		
		startButton=new JButton("开始");
		startButton.addActionListener(this);
		container.add(startButton);
		
		updateBoard();
	}
	
	public void actionPerformed(ActionEvent actionEvent)
	{
		if(actionEvent.getSource()==startButton)
		{
			for(int counter=0; counter<1; counter++)
			{
				knightStepNext();
				updateBoard();
			}
		}
		
		
	}
	
	public int possibilities(int row, int column)
	{
		int i=0;
		for(int n=0; n<8; n++)
		{
			int nextRow=row+vertical[n],nextColumn=column+horizontal[n];
			if(nextRow>=0&&nextRow<MAX&&nextColumn>=0&&nextColumn<MAX&&chessBoard[nextRow][nextColumn]==0)
			{
				i++;
			}
		}
		return i;
	}
	
	public void knightStepNext()
	{
		int possibilities[]=new int[8];
		for(int counter=0; counter<8; counter++)
		{
			possibilities[counter]=0;
		}
		
		int min=0,minn=9;
		for(int n=0; n<8; n++)
		{
			int nextRow=currentRow+vertical[n],nextColumn=currentColumn+horizontal[n];
			if(nextRow>=0&&nextRow<MAX&&nextColumn>=0&&nextColumn<MAX&&chessBoard[nextRow][nextColumn]==0)
			{
				possibilities[n]=chessBoardPossibility[nextRow][nextColumn];
				if(possibilities[n]<minn)
				{
					minn=possibilities[n];
					min=n;
				}
			}
		}
		
		if(minn<9)
		{
			int nextRow=currentRow+vertical[min],nextColumn=currentColumn+horizontal[min];
			if(nextRow>=0&&nextRow<MAX&&nextColumn>=0&&nextColumn<MAX&&chessBoard[nextRow][nextColumn]==0)
			{
				chessBoard[nextRow][nextColumn]=1;
				currentRow=nextRow;
				currentColumn=nextColumn;
				
				for(int counter=0; counter<8; counter++)
				{
					int nextRowx=currentRow+vertical[counter],nextColumnx=currentColumn+horizontal[counter];
					if(nextRowx>=0&&nextRowx<MAX&&nextColumnx>=0&&nextColumnx<MAX&&chessBoard[nextRowx][nextColumnx]==0)
					{
						chessBoardPossibility[nextRowx][nextColumnx]-=1;
					}
				}
			}
			
		}
	}
	
	public void updateBoard()
	{
		String newOutput="     ";
		for(int i=0; i<MAX; i++)
		{
			newOutput+=i + "  ";
		}
		newOutput+="\n";
		for(int row=0; row<chessBoard.length; row++)
		{
			newOutput+="  "+row;
			for(int column=0; column<chessBoard[row].length; column++)
			{                      
				if(chessBoard[row][column]==0)
				{
					newOutput+=" □";
				}
				else
				if(chessBoard[row][column]==1)
				{
					newOutput+=" ■";
				}
			}
			newOutput+="\n";
		}
		
		newOutput+="\n\n\n" + "     ";
		for(int i=0; i<MAX; i++)
		{
			newOutput+=i + "  ";
		}
		newOutput+="\n";
		
		for(int row=0; row<chessBoard.length; row++)
		{
			newOutput+="  "+row;
			for(int column=0; column<chessBoard[row].length; column++)
			{         
				newOutput+="  " + chessBoardPossibility[row][column];
			}
			newOutput+="\n";
		}
		
		outputArea.setText(newOutput);
	}
}


4.8.一些杂散但值得讨论的问题

-
  • 1970年01月01日 08:00

回溯算法之骑士旅行问题

回溯法不同于纯暴力的瞎走,它通过不断的试探,层次变化,攻击问题,实现”保留现有信息“高效作战。 骑士旅行问题: 在N*N的国际象棋棋盘中有一个骑士在一角,问能否通过类似于中国象棋中马的走法...
  • theArcticOcean
  • theArcticOcean
  • 2016-01-26 23:29:19
  • 1277

骑士旅行问题 最小访问数试探法

package homeWork; import java.awt.Container;import java.awt.FlowLayout; import javax.swing.JApplet;i...
  • hn307165411
  • hn307165411
  • 2010-03-25 11:50:00
  • 1075

骑士旅行问题(骑士走棋盘)

一个骑士在棋盘中,给予其一个初始值,
  • firechungelaile
  • firechungelaile
  • 2014-09-28 00:18:32
  • 982

骑士旅行(广度优先搜索)

Description 在一个n m 格子的棋盘上,有一只国际象棋的骑士在棋盘的左下角 (1;1)(如图1),骑士只能根据象棋的规则进行移动,要么横向跳动一格纵向跳动两格,要么纵向跳动一格横向跳动两...
  • chrisblogtk
  • chrisblogtk
  • 2016-04-08 21:42:49
  • 123

骑士旅行问题-java解答

骑士旅行是一个古老而著名的象棋谜题。题目是在一个空的棋盘上移动一个 骑士,从一个方块到另一个,直到踏遍了棋盘的所有的方块。写一个程序, 用深度优先搜索解决这个问题。最好使棋盘的大小可变,这样可以在较小...
  • zlz18225318697
  • zlz18225318697
  • 2016-12-01 11:02:21
  • 265

AYITACM2016省赛第一周(深搜) E - A Knight's Journey骑士的旅行

E - A Knight's Journey Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u...
  • linyuxilu
  • linyuxilu
  • 2016-04-18 21:43:17
  • 476

4336: BJOI2015 骑士的旅行

4336: BJOI2015 骑士的旅行 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 282  Solved: 123 [Submit][S...
  • CRZbulabula
  • CRZbulabula
  • 2016-08-24 19:20:45
  • 776

poj 2488 骑士的旅行

这真是一个很坑爹的题目,其实题目意思很简单就是骑士像象棋里面的马走日字,不能走重复的点并且必须走完所有的点。输出必须按字典顺序。横坐标用字符,‘A’,'B','C'......纵坐标用数字。题目就是D...
  • hellobabygogo3
  • hellobabygogo3
  • 2012-07-15 22:16:34
  • 445

BZOJ 4336 BJOI2015 骑士的旅行

树套树
  • Fuxey
  • Fuxey
  • 2016-03-15 22:13:34
  • 1432
收藏助手
不良信息举报
您举报文章:骑士旅行问题
举报原因:
原因补充:

(最多只允许输入30个字)